home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / misc / date.lha / Date / Oberon / txt / Date.mod < prev    next >
Text File  |  1994-11-30  |  105KB  |  4,436 lines

  1.  MODULE Date; (* Copyright 1994 Kai Hofmann *)
  2.  
  3. (*
  4. ******* Date/--history-- ****************************************************
  5. *
  6. *   NAME
  7. *    history -- This is the development history of the Date module
  8. *
  9. *   VERSION
  10. *    $VER: Date 33.089 (30.11.1994)
  11. *
  12. *   HISTORY
  13. *    16.01.1994 -    Procedures: JulianLeapYear, GregorianLeapYear &
  14. *            HeisLeapYear initiated.
  15. *    22.01.1994 -    Procedures: JulianMonthDays, GregorianMonthDays,
  16. *            HeisMonthDays, JulianYearDays, GregorianYearDays,
  17. *            HeisYearDays, JulianDayDiff, GregorianDayDiff,
  18. *            HeisDayDiff, JulianDaySmaller, GregorianDaySmaller,
  19. *            HeisDaySmaller, JulianWeekday, GregorianWeekday,
  20. *            HeisWeekday, JulianDaysBeforeWeekday,
  21. *            GregorianDaysBeforeWeekday, HeisDaysBeforeWeekday,
  22. *            JulianDaysAfterWeekday, GregorianDaysAfterWeekday,
  23. *            HeisDaysAfterWeekday JulianDiffDate, FreeDate
  24. *            initiated.
  25. *            Types: Weekdays, Date, DatePtr initiated.
  26. *            Vars of Gregorian reform initiated
  27. *            (for changing to different countries)
  28. *    23.01.1994 -    Procedures: JulianDiffDate finished,
  29. *            GregorianDiffDate, HeisDiffDate, JYearToScaliger,
  30. *            GYearToScaliger, HYearToScaliger, ScaligerYearToJ,
  31. *            ScaligerYearToG, ScaligerYearToH, JSYearToJD,
  32. *            GSYearToJD, HSYearToJD, JDtoMJD, MJDtoJD, JulianToJD,
  33. *            GregorianToJD, HeisToJD, TimeToJD, JDToTime, FreeTime
  34. *            initiated.
  35. *            Types: Time, TimePtr initiated.
  36. *    28.01.1994 -    Procedures: GregorianMoonAge, MoonMonthAge,
  37. *            GregorianEaster initiated.
  38. *    30.01.1994 -    Procedures: JulianDiffDate, GregorianDiffDate,
  39. *            HeisDiffDate, JDtoTime, GregorianEaster edited
  40. *            (changing return value from ptr to VAL variables).
  41. *            Procedures: FreeDate, FreeTime deleted.
  42. *            Types: Date, DatePtr, Time, TimePtr deleted (not
  43. *            longer needed, because of the procedure changes).
  44. *            Procedures: GregorianMoonAge, GregorianEaster changed
  45. *            year parameter from CARDINAL to INTEGER (this is more
  46. *            consistent to the rest of the library).
  47. *            Bugs removed: GregorianWeekday, HeisWeekday
  48. *            (before removing, the weekday for leapyears was
  49. *            wrong)
  50. *            Procedure: GregorianEaster finished.
  51. *    30.01.1994 -    Ported to Oberon-2
  52. *    31.01.1994 -    Compiled with Oberon-2 V3.11
  53. *    12.02.1994 -    Procedures: TimeZoneFactor, LMT, TimeToSec, SecToTime
  54. *            initiated.
  55. *            Version-String installed :)
  56. *    12.02.1994 -    Starting translation to SAS C 6.51
  57. *            Date.h translated
  58. *    13.02.1994 -    Continuation of C translation
  59. *    17.02.1994 -    New Oberon-2 Port, because yesterday Daniel Armor
  60. *            gives me a small hint about the SHORT command
  61. *            (I did not know about this!)
  62. *    17.02.1994 -    Small bug in Autodocs removed
  63. *            making this text as Date/--history-- autodoc
  64. *    17.02.1994 -    Continuation of C translation
  65. *    18.02.1994 -    Finished with C translation
  66. *    19.02.1994 -    C bugs removed (thanx to SAS for helping a C Lamer
  67. *            like me!), some optimizations done too.
  68. *    19.02.1994 -    Oberon-2 version compiled with V40.17 includes
  69. *    21.02.1994 -    Writing Modula-II testmodule
  70. *            Vars for the begining of Heis calculation initiated.
  71. *            Fixed small bugs in GregorianWeekday, HeisWeekday,
  72. *            TimeToSec, SecToTime
  73. *            Return-value of LMT changed to LONGINT!
  74. *            Converting testmodule to Oberon-2
  75. *    22.02.1994 -    Converting testmodule to C
  76. *    23.02.1994 -    I noticed, that I forgot the 3 functions
  77. *            JulianWeek, GregorianWeek, HeisWeek
  78. *    24.02.1994 -    Initiated the 3 forgotten functions
  79. *    26.02.1994 -    Initiating new GregorianEastern with Gauß-algorithms
  80. *            but ONLY for 1900-2099!
  81. *    27.02.1994 -    Bug fixed in JulianWeekday
  82. *            Bugs fixed in JulianDayDiff, GregorianDayDiff,
  83. *            HeisDayDiff
  84. *            JulianDayGreater, GregorianDayGreater,
  85. *            HeisDayGreater Initiated.
  86. *    02.03.1994 -    Small bug fixed in HeisdayDiff
  87. *            Bugs from 27.02. fixed in Modula-II and Oberon-2
  88. *            versions
  89. *            I found the way to extend Gregorian Easter!
  90. *            Small bug fixed in JulianWeek, GregorianWeek,
  91. *            HeisWeek (~(M2) is not !(C))
  92. *    05.03.1994 -    Some internal bugs removed
  93. *            New internal procedures GregorianSB,
  94. *            GregorianJHSB, GregorianJHStartSB!
  95. *            Extending GregorianEaster :)
  96. *    11.03.1994 -    Things from 05.03. done in Modula-II and Oberon
  97. *    12.03.1994 -    If __SASC is defined autoinitalization instead of
  98. *            _DateInit will be used!
  99. *    13.03.1994 -    After studying the SAS C Manual again I decided to
  100. *            check for __SASC_650 instead of __SASC because of
  101. *            the available of priorities!
  102. *            Setting the priority of _DateInit for
  103. *            autoinitalization to 600!
  104. *    15.03.1994 -    Making Date as library
  105. *    16.03.1994 -    Some work on the Autodocs was done
  106. *            Eleminating OldGregorianEaster by comments
  107. *            (ANSI: STOP bad standards like that there are NO
  108. *             nestedcomments possible in C!!!)
  109. *    19.03.1994 -    Some work on the Autodocs was done in the M2 Code
  110. *    20.03.1994 -    Some work on the Autodocs was done in the Oberon Code
  111. *    22.03.1994 -    In JDtoMJD, MJD to JD an L was added to the constant
  112. *            In GregorianWeekday(), HeisWeekday(),
  113. *            JulianDiffDate(), GregorianDiffDate(),
  114. *            HeisDiffDate(), JDToTime() I have inserted
  115. *            conversions (found with Borland C++ 4.0)
  116. *    24.03.1994 -    Making SunOS4.1.3, SunOS5.3(Solaris2.3) &
  117. *            RS6000 AIX3.2.? binaries with gcc
  118. *            Eliminating nested commends by inserting a space
  119. *            between / and * (I hate this ANSI C standard
  120. *            feature for commends :(
  121. *    27.03.1994 -    Adding library register assignments to the autodocs
  122. *    03.04.1994 -    Small fixes for the SAS C++ Compiler
  123. *            Small bug fixed in the M2 version of GregorianEaster
  124. *    04.04.1994 -    Adding some 'static' keywords
  125. *    10.04.1994 -    Changing from Shareware to Gift Ware ;-)
  126. *    02.08.1994 -    Small fixes in the Autodocs (thanks to Rita Reichl
  127. *            for correcting my bad english ;-)
  128. *    11.08.1994 -    Again small fixes in the Autodocs!
  129. *    13.11.1994 -    Small fix in JulianWeek(),GregorianWeek(),HeisWeek().
  130. *            Thanks to Jim Rickman for reporting the bug!
  131. *            Small changes in the Autodocs!
  132. *    30.11.1994 -    Fix the bug from 13.11. in M2 and Oberon code.
  133. *
  134. *****************************************************************************
  135. *
  136. *
  137. *)
  138.  
  139. (*
  140. ******* Date/--background-- *************************************************
  141. *
  142. *   NAME
  143. *    Date -- This module was designed to help calc. calendar dates (V33)
  144. *
  145. *   FUNCTION
  146. *    I now about the date routines in the Amiga-OS(TM), but I decided
  147. *    not to use them, because of their limited functionalities and of
  148. *    the portability of this Module!
  149. *
  150. *   NOTES
  151. *    A tropical year is 365.2422 days! / 365d, 5h, 48min, 46sec
  152. *    A moon month is 29.53059 days! / 29d, 12h, 44min, 2.9 sec
  153. *    A moon phase is 7.38265 days!
  154. *
  155. *    (German) Books which helped me creating this:
  156. *        Kleine Naturwissenschaftliche Bibliothek, Band 23
  157. *        Ewige Kalender
  158. *        A.W. Butkewitsch & M.S. Selikson
  159. *        5. Auflage
  160. *        Teubner, Leipzig 1974
  161. *        ISBN 3-322-00393-0
  162. *
  163. *        Tag und Woche, Monat und Jahr: eine Kulturgeschichte des
  164. *        Kalenders
  165. *        Rudolf Wendorff
  166. *        Westdeutscher, Opladen 1993
  167. *        ISBN 3-531-12417-X
  168. *
  169. *        Kalender und Chronologie: Bekanntes & Unbekanntes aus der
  170. *        Kalenderwissenschaft
  171. *        Heinz Zemanek
  172. *        4. Auflage
  173. *        Oldenbourg, München 1987
  174. *        ISBN 3-486-20447-5
  175. *
  176. *        Meyers Handbuch
  177. *        über das Weltall
  178. *        Karl Schaifers & Gerhard Traving
  179. *        5. Auflage
  180. *        Bibliographisches Institut Mannheim 1973
  181. *        ISBN 3-411-00940-3
  182. *
  183. *    (English) Books which helped me creating this:
  184. *        Mathematical Astronomy with a Pocket Calculator
  185. *        Aubrey Jones Fras
  186. *        unknown(first) Edition
  187. *        David & Charles Newton Abbot, London 1978
  188. *        ISBN 0-7153-7675-6
  189. *
  190. *   COPYRIGHT
  191. *    This module is Copyright 1994 by Kai Hofmann - all rights reserved!
  192. *    For private use, Public Domain, Gift Ware, Freeware and Shareware
  193. *    you could use this module under following conditions:
  194. *    - You send me a little gift (money is very welcome :)
  195. *        For Bank Accocunt see below - but *ONLY* send in DM
  196. *        to this Bank Account!!!
  197. *      Other nice gifts: all Amiga hardware, and I am searching for a
  198. *      good old 1541 (C64 floppy)
  199. *    - You include a notice in your product, that you use this library
  200. *      and that it is Copyright by Kai Hofmann!
  201. *    If you want to redistribute this library read the following points:
  202. *    - Redistribution warranty is given to:
  203. *        Fred Fish for his great Amiga-Software-Library
  204. *        The German SAAR AG PD-Library
  205. *        The German AMOK PD-Library
  206. *        All public accessible INTERNET servers and PHONE boxes!
  207. *        All other who NOT take more than DM 5.- for one disk
  208. *        ALL other who NOT take more than DM 50.- for one CD
  209. *    For commercial use send me DM 200.-
  210. *    But if you are Apple or Microsoft you have to send (20000.- US$)
  211. *
  212. *   DISCLAIMER
  213. *
  214. *      THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
  215. *   APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
  216. *   HOLDER AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
  217. *   OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
  218. *   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  219. *   PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
  220. *   PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE
  221. *   COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  222. *
  223. *      IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
  224. *   WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY REDISTRIBUTE THE
  225. *   PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
  226. *   GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
  227. *   USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS
  228. *   OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR
  229. *   THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
  230. *   PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
  231. *   POSSIBILITY OF SUCH DAMAGES.
  232. *
  233. *   ADDITIONAL INFORMATIONS
  234. *    I have tried to make portable/usefull and I hope bugfree software
  235. *    for eternity - but this seems to be impossible (sorry!) :)
  236. *    So I hope you will pay a fee for this.
  237. *
  238. *   AUTHOR
  239. *    Kai Hofmann
  240. *    Arberger Heerstraße 92
  241. *    28307 Bremen
  242. *    Germany
  243. *    EMail: i07m@alf.zfn.uni-bremen.de
  244. *    (no phone - I hate it!)
  245. *
  246. *    Bank account : 1203 7503
  247. *    Account owner: Kai Hofmann
  248. *    Bank code    : 290 501 01
  249. *    Bank name    : Sparkasse in Bremen
  250. *    Bank address : 28307 Bremen / Germany
  251. *
  252. *    THANX
  253. *    Thanx are going to the following people:
  254. *    Danial Armor        - For his hint about the Oberon-2 SHORT
  255. *                  command
  256. *    Heinz Zemanek        - For his great book
  257. *    Christian Schaefer    - For spending time on this lib with his
  258. *                  Borland C++ 4.0 compiler
  259. *    Rita Reichl        - For correcting my bad english ;-)
  260. *    Jim Rickman        - For reporting a bug
  261. *
  262. *****************************************************************************
  263. *
  264. *
  265. *)
  266.  (*
  267.  (*$StackChk-  *)
  268.  (*$OvflChk-   *)
  269.  (*$RangeChk-  *)
  270.  (*$CaseChk-   *)
  271.  (*$ReturnChk- *)
  272.  (*$NilChk-    *)
  273.  (*$OddChk+    *)
  274.  (*$TypeChk-   *)
  275.  (*$ClearVars- *)
  276.  (*$Debug-     *)
  277.  *)
  278.  
  279.  IMPORT MATHLIB;
  280.  
  281.  
  282.  TYPE
  283.     Weekdays*    = SHORTINT; (* 0=dayerr; 1=Monday; ... 7=Sunday *)
  284.  
  285.  CONST
  286.     dayerr*        = 0; (* consts for TYPE Weekdays *)
  287.     Monday*        = 1;
  288.     Tuesday*    = 2;
  289.     Wednesday*    = 3;
  290.     Thursday*    = 4;
  291.     Friday*        = 5;
  292.     Saturday*    = 6;
  293.     Sunday*        = 7;
  294.  
  295.  VAR
  296.     BeforeGregorianDay, BeforeGregorianMonth,
  297.     AfterGregorianDay, AfterGregorianMonth,
  298.     StartHeisDay,StartHeisMonth            : SHORTINT;
  299.     BeforeGregorianYear, AfterGregorianYear,
  300.     StartHeisYear                    : INTEGER;
  301.  
  302.  (* ----------------------------------------------------------------------- *)
  303.  
  304.  PROCEDURE JulianLeapYear*(year : INTEGER) : BOOLEAN;
  305.  
  306. (*
  307. ******* Date/JulianLeapYear *************************************************
  308. *
  309. *   NAME
  310. *    JulianLeapYear -- Checks if a year is a leap year for jj. (V33)
  311. *
  312. *   SYNOPSIS
  313. *    leapyear := JulianLeapYear(year);
  314. *
  315. *    PROCEDURE JulianLeapYear(year : INTEGER) : BOOLEAN;
  316. *
  317. *   FUNCTION
  318. *    JulianLeapYear checks if a year is a leap year in the julian calendar
  319. *    For years after Chr. it checks if the year is devideable by 4.
  320. *    For years before Chr. a leap year must have a modulo 4 value of 1
  321. *
  322. *   INPUTS
  323. *    year - The year which should be checked (from -32768 to 32767)
  324. *        I think only values from -7 to 1582 are valid, because of
  325. *        the variant that was done on -8 by Augustus!
  326. *
  327. *   RESULT
  328. *    leapyear - TRUE if the year is a leap year, otherwise false.
  329. *
  330. *   EXAMPLE
  331. *    ...
  332. *    IF JulianLeapYear(1994) THEN
  333. *      WriteString("leap year!");
  334. *    ELSE
  335. *      WriteString("no leap year!");
  336. *    END;
  337. *    WriteLn;
  338. *    ...
  339. *
  340. *   NOTES
  341. *    A year is 365.25 days long!
  342. *    Use this function only for values from -7 to 1582!
  343. *
  344. *   BUGS
  345. *    No known bugs.
  346. *
  347. *   SEE ALSO
  348. *    GregorianLeapYear(),HeisLeapYear()
  349. *
  350. *****************************************************************************
  351. *
  352. *
  353. *)
  354.  
  355.  BEGIN
  356.    IF year <= 0 THEN
  357.      RETURN(ABS(year) MOD 4 = 1);
  358.    ELSE    (* year > 0 *)
  359.      RETURN(year MOD 4 = 0);
  360.    END;
  361.  END JulianLeapYear;
  362.  
  363.  
  364.  PROCEDURE GregorianLeapYear*(year : INTEGER) : BOOLEAN;
  365.  
  366. (*
  367. ******* Date/GregorianLeapYear **********************************************
  368. *
  369. *   NAME
  370. *    GregorianLeapYear -- Checks if a year is a leap year. (V33)
  371. *
  372. *   SYNOPSIS
  373. *    leapyear := GregorianLeapYear(year);
  374. *
  375. *    PROCEDURE GregorianLeapYear(year : INTEGER) : BOOLEAN;
  376. *
  377. *   FUNCTION
  378. *    GregorianLeapYear checks if a year is a leap year.
  379. *    For years after 1582 all years devideable by 4 are leap years,
  380. *    without years devideable by 100, but years devideable by 400
  381. *    are leap years again!
  382. *    For years before 1582 see JulianLeapYear().
  383. *
  384. *   INPUTS
  385. *    year - The year which should be checked (from -32768 to 32767)
  386. *        I think only values from -7 to 3200 are valid, because of
  387. *        the variant that was done on -8 by Augustus!
  388. *
  389. *   RESULT
  390. *    leapyear - TRUE if the year is a leap year, otherwise false.
  391. *
  392. *   EXAMPLE
  393. *    ...
  394. *    IF GregorianLeapYear(1994) THEN
  395. *      WriteString("leap year!");
  396. *    ELSE
  397. *      WriteString("no leap year!");
  398. *    END;
  399. *    WriteLn;
  400. *    ...
  401. *
  402. *   NOTES
  403. *    A year is 365.2425 days long!
  404. *    Use this function only for values from -7 to 3200!
  405. *
  406. *   BUGS
  407. *    No known bugs.
  408. *
  409. *   SEE ALSO
  410. *    JulianLeapYear(),HeisLeapYear()
  411. *
  412. *****************************************************************************
  413. *
  414. *
  415. *)
  416.  
  417.  BEGIN
  418.    IF year < BeforeGregorianYear THEN    (* Year of the Gregorian reform *)
  419.      RETURN(JulianLeapYear(year));
  420.    ELSE    (* AfterGregorianYear reform *)
  421.      RETURN((year MOD 4 = 0) AND ((year MOD 100 > 0) OR (year MOD 400 = 0)));
  422.    END;
  423.  END GregorianLeapYear;
  424.  
  425.  
  426.  PROCEDURE HeisLeapYear*(year : INTEGER) : BOOLEAN;
  427.  
  428. (*
  429. ******* Date/HeisLeapYear ***************************************************
  430. *
  431. *   NAME
  432. *    HeisLeapYear -- Checks if a year is a leap year. (V33)
  433. *
  434. *   SYNOPSIS
  435. *    leapyear := HeisLeapYear(year);
  436. *
  437. *    PROCEDURE HeisLeapYear(year : INTEGER) : BOOLEAN;
  438. *
  439. *   FUNCTION
  440. *    HeisLeapYear checks if a year is a leap year.
  441. *    For years after 1582 see GregorianLeapYear(),
  442. *    The correction from N. Heis says, that all years devideable by
  443. *    3200 are no longer leap years!
  444. *    For years before 1582 see JulianLeapYear
  445. *
  446. *   INPUTS
  447. *    year - The year which should be checked (from -32768 to 32767)
  448. *        I think only values from -7 to 8000 are valid, because of
  449. *        the variant that was done on -8 by Augustus!
  450. *
  451. *   RESULT
  452. *    leapyear - TRUE if the year is a leap year, otherwise false.
  453. *
  454. *   EXAMPLE
  455. *    ...
  456. *    IF HeisLeapYear(1994) THEN
  457. *      WriteString("leap year!");
  458. *    ELSE
  459. *      WriteString("no leap year!");
  460. *    END;
  461. *    WriteLn;
  462. *    ...
  463. *
  464. *   NOTES
  465. *    A year is now 365.2421875 days!
  466. *    Use this function only for values from -7 to 8000!
  467. *
  468. *   BUGS
  469. *    No known bugs.
  470. *
  471. *   SEE ALSO
  472. *    JulianLeapYear(),GregorianLeapYear()
  473. *
  474. *****************************************************************************
  475. *
  476. *
  477. *)
  478.  
  479.  BEGIN
  480.    IF year < BeforeGregorianYear THEN    (* Year of the Gregorian reform *)
  481.      RETURN(JulianLeapYear(year));
  482.    ELSE (* year >= AfterGregorianYear *)
  483.      IF year MOD 3200 = 0 THEN    (* Correction from N. Heis *)
  484.        RETURN(FALSE);        (* (no leap year all 3200 years) *)
  485.      ELSE
  486.        RETURN(GregorianLeapYear(year));
  487.      END;
  488.    END;
  489.  END HeisLeapYear;
  490.  
  491.  (* ----------------------------------------------------------------------- *)
  492.  
  493.  PROCEDURE JulianMonthDays*(month : SHORTINT; year : INTEGER) : SHORTINT;
  494.  
  495. (*
  496. ******* Date/JulianMonthDays ************************************************
  497. *
  498. *   NAME
  499. *    JulianMonthDays -- Gives back the number of days of a month. (V33)
  500. *
  501. *   SYNOPSIS
  502. *    days := JulianMonthDays(month,year);
  503. *
  504. *    PROCEDURE JulianMonthDays(month : SHORTINT;
  505. *        year : INTEGER) : SHORTINT;
  506. *
  507. *   FUNCTION
  508. *    JulianMonthDays gives you back the number of days a month in
  509. *    a specified year has.
  510. *
  511. *   INPUTS
  512. *    month - The month from wich you want to get the number of days.
  513. *    year  - The year in which the month is.
  514. *
  515. *   RESULT
  516. *    days - The number of days the month uses, or 0 if you use
  517. *        a wrong month.
  518. *
  519. *   EXAMPLE
  520. *    ...
  521. *    days := JulianMonthDays(1,1994);
  522. *    WriteString("Days of January 1994 : ");
  523. *    WriteCard(days,2); WriteLn;
  524. *    ...
  525. *
  526. *   NOTES
  527. *    It is better only to use this function for years from -7 to 1582!
  528. *
  529. *   BUGS
  530. *    No known bugs.
  531. *
  532. *   SEE ALSO
  533. *    JulianLeapYear(),GregorianMonthDays(),HeisMonthDays()
  534. *
  535. *****************************************************************************
  536. *
  537. *
  538. *)
  539.  
  540.  BEGIN
  541.    IF month IN {1,3,5,7,8,10,12} THEN
  542.      RETURN(31);
  543.    ELSIF month IN {4,6,9,11} THEN
  544.      RETURN(30);
  545.    ELSIF (month = 2) AND JulianLeapYear(year) THEN
  546.      RETURN(29);
  547.    ELSIF (month = 2) AND (NOT JulianLeapYear(year)) THEN
  548.      RETURN(28);
  549.    ELSE (* Error - wrong month *)
  550.      RETURN(0);
  551.    END;
  552.  END JulianMonthDays;
  553.  
  554.  
  555.  PROCEDURE GregorianMonthDays*(month : SHORTINT; year : INTEGER) : SHORTINT;
  556.  
  557. (*
  558. ******* Date/GregorianMonthDays *********************************************
  559. *
  560. *   NAME
  561. *    GregorianMonthDays -- Gives back the number of days of a month. (V33)
  562. *
  563. *   SYNOPSIS
  564. *    days := GregorianMonthDays(month,year);
  565. *
  566. *    PROCEDURE GregorianMonthDays(month : SHORTINT;
  567. *        year : INTEGER) : SHORTINT;
  568. *
  569. *   FUNCTION
  570. *    GregorianMonthDays gives you back the number of days a month in
  571. *    a specified year has.
  572. *    For the year 1582 and the month 10 there are only 21 days,
  573. *    because of the Gregorian-reform 10 days are delete from
  574. *    the month (for more - look out for books about this!)
  575. *
  576. *   INPUTS
  577. *    month - The month from wich you want to get the number of days.
  578. *    year  - The year in which the month is.
  579. *
  580. *   RESULT
  581. *    days - The number of days the month uses, or 0 if you use
  582. *        a wrong month.
  583. *
  584. *   EXAMPLE
  585. *    ...
  586. *    days := GregorianMonthDays(1,1994);
  587. *    WriteString("Days of January 1994 : ");
  588. *    WriteCard(days,2); WriteLn;
  589. *    ...
  590. *
  591. *   NOTES
  592. *    Use this function only for years from -7 to 3200!
  593. *
  594. *   BUGS
  595. *    If the reform in a country is not in the same month an error will
  596. *    occur!
  597. *
  598. *   SEE ALSO
  599. *    GregorianLeapYear(),JulianMonthDays(),HeisMonthDays()
  600. *
  601. *****************************************************************************
  602. *
  603. *
  604. *)
  605.  
  606.  BEGIN
  607.    IF (year = AfterGregorianYear) AND (month = AfterGregorianMonth) THEN
  608.      (* 10 days canceled by Gregor XIII
  609.         in countries who chnaged later are more days *)
  610.      RETURN(31-((AfterGregorianDay-BeforeGregorianDay)-1));
  611.    ELSIF (month = 2) AND GregorianLeapYear(year) THEN
  612.      RETURN(29);
  613.    ELSIF (month = 2) AND (NOT GregorianLeapYear(year)) THEN
  614.      RETURN(28);
  615.    ELSE (* use Julian function for other calcs. *)
  616.      RETURN(JulianMonthDays(month,year));
  617.    END;
  618.  END GregorianMonthDays;
  619.  
  620.  
  621.  PROCEDURE HeisMonthDays*(month : SHORTINT; year : INTEGER) : SHORTINT;
  622.  
  623. (*
  624. ******* Date/HeisMonthDays **************************************************
  625. *
  626. *   NAME
  627. *    HeisMonthDays -- Gives back the number of days of a month. (V33)
  628. *
  629. *   SYNOPSIS
  630. *    days := HeisMonthDays(month,year);
  631. *
  632. *    PROCEDURE HeisMonthDays(month : SHORTINT;
  633. *        year : INTEGER) : SHORTINT;
  634. *
  635. *   FUNCTION
  636. *    HeisMonthDays gives you back the number of days a month in
  637. *    a specified year has.
  638. *    For the year 1582 and the month 10 there are only 21 days,
  639. *    because of the Gregorian-reform 10 days are delete from
  640. *    the month (for more - look out for books about this!)
  641. *
  642. *   INPUTS
  643. *    month - The month from wich you want to get the number of days.
  644. *    year  - The year in which the month is.
  645. *
  646. *   RESULT
  647. *    days - The number of days the month uses, or 0 if you use
  648. *        a wrong month.
  649. *
  650. *   EXAMPLE
  651. *    ...
  652. *    days := HeisMonthDays(1,1994);
  653. *    WriteString("Days of January 1994 : ");
  654. *    WriteCard(days,2); WriteLn;
  655. *    ...
  656. *
  657. *   NOTES
  658. *    Use this function only for years from -7 to 8000!
  659. *
  660. *   BUGS
  661. *    See GregorianMonthDays!
  662. *
  663. *   SEE ALSO
  664. *    HeisLeapYear(),JulianMonthDays(),GregorianMonthDays()
  665. *
  666. *****************************************************************************
  667. *
  668. *
  669. *)
  670.  
  671.  BEGIN
  672.    IF (month = 2) AND HeisLeapYear(year) THEN
  673.      RETURN(29);
  674.    ELSIF (month = 2) AND (NOT HeisLeapYear(year)) THEN
  675.      RETURN(28);
  676.    ELSE (* use Gregorian function for other calcs *)
  677.      RETURN(GregorianMonthDays(month,year));
  678.    END;
  679.  END HeisMonthDays;
  680.  
  681.  (* ----------------------------------------------------------------------- *)
  682.  
  683.  PROCEDURE JulianYearDays*(year : INTEGER) : INTEGER;
  684.  
  685. (*
  686. ******* Date/JulianYearDays *************************************************
  687. *
  688. *   NAME
  689. *    JulianYearDays -- Gives back the number of days in a year. (V33)
  690. *
  691. *   SYNOPSIS
  692. *    days := JulianYearDays(year);
  693. *
  694. *    PROCEDURE JulianYearDays(year : INTEGER) : INTEGER;
  695. *
  696. *   FUNCTION
  697. *    JulianYearDays gives you back the number of days in
  698. *    a specified year.
  699. *
  700. *   INPUTS
  701. *    year  - The year in which to count the days.
  702. *
  703. *   RESULT
  704. *    days - The number of days the year uses.
  705. *
  706. *   EXAMPLE
  707. *    ...
  708. *    days := JulianYearDays(1994);
  709. *    WriteString("Days of 1994 : ");
  710. *    WriteCard(days,3); WriteLn;
  711. *    ...
  712. *
  713. *   NOTES
  714. *    It is better only to use this function for years from -7 to 1582!
  715. *
  716. *   BUGS
  717. *    No known bugs.
  718. *
  719. *   SEE ALSO
  720. *    JulianMonthDays(),GregorianYearDays(),HeisYearDays()
  721. *
  722. *****************************************************************************
  723. *
  724. *
  725. *)
  726.  
  727.  VAR
  728.     month    : SHORTINT;
  729.     days    : INTEGER;
  730.  
  731.  BEGIN
  732.    days := 0;
  733.    FOR month := 1 TO 12 DO (* add the days of all 12 month *)
  734.      days := days + JulianMonthDays(month,year);
  735.    END;
  736.    RETURN(days);
  737.  END JulianYearDays;
  738.  
  739.  
  740.  PROCEDURE GregorianYearDays*(year : INTEGER) : INTEGER;
  741.  
  742. (*
  743. ******* Date/GregorianYearDays **********************************************
  744. *
  745. *   NAME
  746. *    GregorianYearDays -- Gives back the number of days in a year. (V33)
  747. *
  748. *   SYNOPSIS
  749. *    days := GregorianYearDays(year);
  750. *
  751. *    PROCEDURE GregorianYearDays(year : INTEGER) : INTEGER;
  752. *
  753. *   FUNCTION
  754. *    GregorianYearDays gives you back the number of days in
  755. *    a specified year.
  756. *
  757. *   INPUTS
  758. *    year  - The year in which to count the days.
  759. *        (I think its better not to use years before -7!)
  760. *
  761. *   RESULT
  762. *    days - The number of days the year uses.
  763. *
  764. *   EXAMPLE
  765. *    ...
  766. *    days := GregorianYearDays(1994);
  767. *    WriteString("Days of 1994 : ");
  768. *    WriteCard(days,3); WriteLn;
  769. *    ...
  770. *
  771. *   NOTES
  772. *    It is better only to use this function for years from -7 to 3200!
  773. *
  774. *   BUGS
  775. *    No known bugs.
  776. *
  777. *   SEE ALSO
  778. *    GregorianMonthDays(),JulianYearDays(),HeisYearDays()
  779. *
  780. *****************************************************************************
  781. *
  782. *
  783. *)
  784.  
  785.  VAR
  786.     month    : SHORTINT;
  787.     days    : INTEGER;
  788.  
  789.  BEGIN
  790.    days := 0;
  791.    FOR month := 1 TO 12 DO (* add the days of all 12 month *)
  792.      days := days + GregorianMonthDays(month,year);
  793.    END;
  794.    RETURN(days);
  795.  END GregorianYearDays;
  796.  
  797.  
  798.  PROCEDURE HeisYearDays*(year : INTEGER) : INTEGER;
  799.  
  800. (*
  801. ******* Date/HeisYearDays ***************************************************
  802. *
  803. *   NAME
  804. *    HeisYearDays -- Gives back the number of days in a year. (V33)
  805. *
  806. *   SYNOPSIS
  807. *    days := HeisYearDays(year);
  808. *
  809. *    PROCEDURE HeisYearDays(year : INTEGER) : INTEGER;
  810. *
  811. *   FUNCTION
  812. *    HeisYearDays gives you back the number of days in
  813. *    a specified year.
  814. *
  815. *   INPUTS
  816. *    year  - The year in which to count the days.
  817. *        (I think its better not to use years before -7!)
  818. *
  819. *   RESULT
  820. *    days - The number of days the year uses.
  821. *
  822. *   EXAMPLE
  823. *    ...
  824. *    days := HeisYearDays(1994);
  825. *    WriteString("Days of 1994 : ");
  826. *    WriteCard(days,3); WriteLn;
  827. *    ...
  828. *
  829. *   NOTES
  830. *    It is better only to use this function for years from -7 to 8000!
  831. *
  832. *   BUGS
  833. *    No known bugs.
  834. *
  835. *   SEE ALSO
  836. *    HeisMonthDays(),JulianYearDays(),GregorianYearDays()
  837. *
  838. *****************************************************************************
  839. *
  840. *
  841. *)
  842.  
  843.  VAR
  844.     month    : SHORTINT;
  845.     days    : INTEGER;
  846.  
  847.  BEGIN
  848.    days := 0;
  849.    FOR month := 1 TO 12 DO (* add the days of all 12 month *)
  850.      days := days + HeisMonthDays(month,year);
  851.    END;
  852.    RETURN(days);
  853.  END HeisYearDays;
  854.  
  855.  (* ----------------------------------------------------------------------- *)
  856.  
  857.  PROCEDURE JulianDaySmaller*(day1,month1 : SHORTINT; year1 : INTEGER;
  858.             day2,month2 : SHORTINT; year2 : INTEGER) : BOOLEAN;
  859.  
  860. (*
  861. ******* Date/JulianDaySmaller ***********************************************
  862. *
  863. *   NAME
  864. *    JulianDaySmaller -- Checks if date1 is smaller than date2. (V33)
  865. *
  866. *   SYNOPSIS
  867. *    smaller := JulianDaySmaller(day1,month1,year1,day2,month2,year2);
  868. *
  869. *    PROCEDURE JulianDaySmaller(day1,month1 : SHORTINT; year1 : INTEGER;
  870. *        day2,month2 : SHORTINT; year2 : INTEGER) : BOOLEAN;
  871. *
  872. *   FUNCTION
  873. *    JulianDaySmaller test if date1 is smaller than date2.
  874. *
  875. *   INPUTS
  876. *    day1   - day of the first date
  877. *    month1 - month of the first date
  878. *    year1  - year of the first date
  879. *    day2   - day of the second date
  880. *    month2 - month of the second month
  881. *    year2  - year of the second date
  882. *
  883. *   RESULT
  884. *    smaller - This is TRUE is date1 < date2 otherwise it's FALSE.
  885. *
  886. *   EXAMPLE
  887. *    ...
  888. *    IF JulianDaySmaller(18,9,1970,22,1,1994) THEN
  889. *      WriteString("<"); WriteLn;
  890. *    ELSE
  891. *      WriteString(">="); WriteLn;
  892. *    END;
  893. *    ...
  894. *
  895. *   NOTES
  896. *    It is better only to use this function for years from -7 to 1582!
  897. *
  898. *   BUGS
  899. *    No known bugs.
  900. *
  901. *   SEE ALSO
  902. *    GregorianDaySmaller(),HeisDaySmaller()
  903. *
  904. *****************************************************************************
  905. *
  906. *
  907. *)
  908.  
  909.  BEGIN
  910.    IF year1 = year2 THEN
  911.      IF month1 = month2 THEN
  912.        RETURN(day1 < day2);
  913.      ELSE
  914.        RETURN(month1 < month2);
  915.      END;
  916.    ELSE
  917.      RETURN(year1 < year2);
  918.    END;
  919.  END JulianDaySmaller;
  920.  
  921.  
  922.  PROCEDURE GregorianDaySmaller*(day1,month1 : SHORTINT; year1 : INTEGER;
  923.             day2,month2 : SHORTINT; year2 : INTEGER) : BOOLEAN;
  924.  
  925. (*
  926. ******* Date/GregorianDaySmaller ********************************************
  927. *
  928. *   NAME
  929. *    GregorianDaySmaller -- Checks if date1 is smaller than date2. (V33)
  930. *
  931. *   SYNOPSIS
  932. *    smaller := GregorianDaySmaller(day1,month1,year1,day2,month2,year2);
  933. *
  934. *    PROCEDURE GregorianDaySmaller(day1,month1 : SHORTINT;
  935. *        year1 : INTEGER; day2,month2 : SHORTINT;
  936. *        year2 : INTEGER) : BOOLEAN;
  937. *
  938. *   FUNCTION
  939. *    GregorianDaySmaller test if date1 is smaller than date2.
  940. *
  941. *   INPUTS
  942. *    day1   - day of the first date
  943. *    month1 - month of the first date
  944. *    year1  - year of the first date
  945. *    day2   - day of the second date
  946. *    month2 - month of the second month
  947. *    year2  - year of the second date
  948. *
  949. *   RESULT
  950. *    smaller - This is TRUE is date1 < date2 otherwise it's FALSE.
  951. *
  952. *   EXAMPLE
  953. *    ...
  954. *    IF GregorianDaySmaller(18,9,1970,22,1,1994) THEN
  955. *      WriteString("<"); WriteLn;
  956. *    ELSE
  957. *      WriteString(">="); WriteLn;
  958. *    END;
  959. *    ...
  960. *
  961. *   NOTES
  962. *    It is better only to use this function for years from -7 to 3200!
  963. *
  964. *   BUGS
  965. *    No known bugs.
  966. *
  967. *   SEE ALSO
  968. *    JulianDaySmaller(),HeisDaySmaller()
  969. *
  970. *****************************************************************************
  971. *
  972. *
  973. *)
  974.  
  975.  BEGIN
  976.    RETURN(JulianDaySmaller(day1,month1,year1,day2,month2,year2));
  977.  END GregorianDaySmaller;
  978.  
  979.  
  980.  PROCEDURE HeisDaySmaller*(day1,month1 : SHORTINT; year1 : INTEGER;
  981.             day2,month2 : SHORTINT; year2 : INTEGER) : BOOLEAN;
  982.  
  983. (*
  984. ******* Date/HeisDaySmaller *************************************************
  985. *
  986. *   NAME
  987. *    HeisDaySmaller -- Checks if date1 is smaller than date2. (V33)
  988. *
  989. *   SYNOPSIS
  990. *    smaller := HeisDaySmaller(day1,month1,year1,day2,month2,year2);
  991. *
  992. *    PROCEDURE HeisDaySmaller(day1,month1 : SHORTINT; year1 : INTEGER;
  993. *        day2,month2 : SHORTINT; year2 : INTEGER) : BOOLEAN;
  994. *
  995. *   FUNCTION
  996. *    HeisDaySmaller test if date1 is smaller than date2.
  997. *
  998. *   INPUTS
  999. *    day1   - day of the first date
  1000. *    month1 - month of the first date
  1001. *    year1  - year of the first date
  1002. *    day2   - day of the second date
  1003. *    month2 - month of the second month
  1004. *    year2  - year of the second date
  1005. *
  1006. *   RESULT
  1007. *    smaller - This is TRUE is date1 < date2 otherwise it's FALSE.
  1008. *
  1009. *   EXAMPLE
  1010. *    ...
  1011. *    IF HeisDaySmaller(18,9,1970,22,1,1994) THEN
  1012. *      WriteString("<"); WriteLn;
  1013. *    ELSE
  1014. *      WriteString(">="); WriteLn;
  1015. *    END;
  1016. *    ...
  1017. *
  1018. *   NOTES
  1019. *    It is better only to use this function for years from -7 to 8000!
  1020. *
  1021. *   BUGS
  1022. *    No known bugs.
  1023. *
  1024. *   SEE ALSO
  1025. *    JulianDaySmaller(),GregorianDaySmaller()
  1026. *
  1027. *****************************************************************************
  1028. *
  1029. *
  1030. *)
  1031.  
  1032.  BEGIN
  1033.    (* To avoid bugs if differences to JulianDaySmaller was found! *)
  1034.    RETURN(GregorianDaySmaller(day1,month1,year1,day2,month2,year2));
  1035.  END HeisDaySmaller;
  1036.  
  1037.  (* ----------------------------------------------------------------------- *)
  1038.  
  1039.  PROCEDURE JulianDayGreater*(day1,month1 : SHORTINT; year1 : INTEGER;
  1040.             day2,month2 : SHORTINT; year2 : INTEGER) : BOOLEAN;
  1041.  
  1042. (*
  1043. ******* Date/JulianDayGreater ***********************************************
  1044. *
  1045. *   NAME
  1046. *    JulianDayGreater -- Checks if date1 is greater than date2. (V33)
  1047. *
  1048. *   SYNOPSIS
  1049. *    greater := JulianDayGreater(day1,month1,year1,day2,month2,year2);
  1050. *
  1051. *    PROCEDURE JulianDayGreater(day1,month1 : SHORTINT; year1 : INTEGER;
  1052. *        day2,month2 : SHORTINT; year2 : INTEGER) : BOOLEAN;
  1053. *
  1054. *   FUNCTION
  1055. *    JulianDayGreater test if date1 is greater than date2.
  1056. *
  1057. *   INPUTS
  1058. *    day1   - day of the first date
  1059. *    month1 - month of the first date
  1060. *    year1  - year of the first date
  1061. *    day2   - day of the second date
  1062. *    month2 - month of the second month
  1063. *    year2  - year of the second date
  1064. *
  1065. *   RESULT
  1066. *    greater - This is TRUE is date1 > date2 otherwise it's FALSE.
  1067. *
  1068. *   EXAMPLE
  1069. *    ...
  1070. *    IF JulianDayGreater(18,9,1970,22,1,1994) THEN
  1071. *      WriteString(">"); WriteLn;
  1072. *    ELSE
  1073. *      WriteString("<="); WriteLn;
  1074. *    END;
  1075. *    ...
  1076. *
  1077. *   NOTES
  1078. *    It is better only to use this function for years from -7 to 1582!
  1079. *
  1080. *   BUGS
  1081. *    No known bugs.
  1082. *
  1083. *   SEE ALSO
  1084. *    GregorianDayGreater(),HeisDayGreater()
  1085. *
  1086. *****************************************************************************
  1087. *
  1088. *
  1089. *)
  1090.  
  1091.  BEGIN
  1092.    IF year1 = year2 THEN
  1093.      IF month1 = month2 THEN
  1094.        RETURN(day1 > day2);
  1095.      ELSE
  1096.        RETURN(month1 > month2);
  1097.      END;
  1098.    ELSE
  1099.      RETURN(year1 > year2);
  1100.    END;
  1101.  END JulianDayGreater;
  1102.  
  1103.  
  1104.  PROCEDURE GregorianDayGreater*(day1,month1 : SHORTINT; year1 : INTEGER;
  1105.             day2,month2 : SHORTINT; year2 : INTEGER) : BOOLEAN;
  1106.  
  1107. (*
  1108. ******* Date/GregorianDayGreater ********************************************
  1109. *
  1110. *   NAME
  1111. *    GregorianDayGreater -- Checks if date1 is great than date2. (V33)
  1112. *
  1113. *   SYNOPSIS
  1114. *    greater := GregorianDayGreater(day1,month1,year1,day2,month2,year2);
  1115. *
  1116. *    PROCEDURE GregorianDayGreater(day1,month1 : SHORTINT;
  1117. *        year1 : INTEGER; day2,month2 : SHORTINT;
  1118. *        year2 : INTEGER) : BOOLEAN;
  1119. *
  1120. *   FUNCTION
  1121. *    GregorianDayGreater test if date1 is greater than date2.
  1122. *
  1123. *   INPUTS
  1124. *    day1   - day of the first date
  1125. *    month1 - month of the first date
  1126. *    year1  - year of the first date
  1127. *    day2   - day of the second date
  1128. *    month2 - month of the second month
  1129. *    year2  - year of the second date
  1130. *
  1131. *   RESULT
  1132. *    greater - This is TRUE is date1 > date2 otherwise it's FALSE.
  1133. *
  1134. *   EXAMPLE
  1135. *    ...
  1136. *    IF GregorianDayGreater(18,9,1970,22,1,1994) THEN
  1137. *      WriteString(">"); WriteLn;
  1138. *    ELSE
  1139. *      WriteString("<="); WriteLn;
  1140. *    END;
  1141. *    ...
  1142. *
  1143. *   NOTES
  1144. *    It is better only to use this function for years from -7 to 3200!
  1145. *
  1146. *   BUGS
  1147. *    No known bugs.
  1148. *
  1149. *   SEE ALSO
  1150. *    JulianDayGreater(),HeisDayGreater()
  1151. *
  1152. *****************************************************************************
  1153. *
  1154. *
  1155. *)
  1156.  
  1157.  BEGIN
  1158.    RETURN(JulianDayGreater(day1,month1,year1,day2,month2,year2));
  1159.  END GregorianDayGreater;
  1160.  
  1161.  
  1162.  PROCEDURE HeisDayGreater*(day1,month1 : SHORTINT; year1 : INTEGER;
  1163.             day2,month2 : SHORTINT; year2 : INTEGER) : BOOLEAN;
  1164.  
  1165. (*
  1166. ******* Date/HeisDayGreater *************************************************
  1167. *
  1168. *   NAME
  1169. *    HeisDayGreater -- Checks if date1 is greater than date2. (V33)
  1170. *
  1171. *   SYNOPSIS
  1172. *    greater := HeisDayGreater(day1,month1,year1,day2,month2,year2);
  1173. *
  1174. *    PROCEDURE HeisDayGreater(day1,month1 : SHORTINT; year1 : INTEGER;
  1175. *        day2,month2 : SHORTINT; year2 : INTEGER) : BOOLEAN;
  1176. *
  1177. *   FUNCTION
  1178. *    HeisDayGreater test if date1 is great than date2.
  1179. *
  1180. *   INPUTS
  1181. *    day1   - day of the first date
  1182. *    month1 - month of the first date
  1183. *    year1  - year of the first date
  1184. *    day2   - day of the second date
  1185. *    month2 - month of the second month
  1186. *    year2  - year of the second date
  1187. *
  1188. *   RESULT
  1189. *    greater - This is TRUE is date1 > date2 otherwise it's FALSE.
  1190. *
  1191. *   EXAMPLE
  1192. *    ...
  1193. *    IF HeisDaySmaller(18,9,1970,22,1,1994) THEN
  1194. *      WriteString(">"); WriteLn;
  1195. *    ELSE
  1196. *      WriteString("<="); WriteLn;
  1197. *    END;
  1198. *    ...
  1199. *
  1200. *   NOTES
  1201. *    It is better only to use this function for years from -7 to 8000!
  1202. *
  1203. *   BUGS
  1204. *    No known bugs.
  1205. *
  1206. *   SEE ALSO
  1207. *    JulianDayGreater(),GregorianDayGreater()
  1208. *
  1209. *****************************************************************************
  1210. *
  1211. *
  1212. *)
  1213.  
  1214.  BEGIN
  1215.    (* To avoid bugs if differences to JulianDayGreater was found! *)
  1216.    RETURN(GregorianDayGreater(day1,month1,year1,day2,month2,year2));
  1217.  END HeisDayGreater;
  1218.  
  1219.  (* ----------------------------------------------------------------------- *)
  1220.  
  1221.  PROCEDURE JulianDayDiff*(day1,month1 : SHORTINT; year1 : INTEGER;
  1222.             day2,month2 : SHORTINT; year2 : INTEGER) : LONGINT;
  1223.  
  1224. (*
  1225. ******* Date/JulianDayDiff **************************************************
  1226. *
  1227. *   NAME
  1228. *    JulianDayDiff -- Calculates the days between 2 dates. (V33)
  1229. *
  1230. *   SYNOPSIS
  1231. *    days := JulianDayDiff(day1,month1,year1,day2,month2,year2);
  1232. *
  1233. *    PROCEDURE JulianDayDiff(day1,month1 : SHORTINT; year1 : INTEGER;
  1234. *        day2,month2 : SHORTINT; year2 : INTEGER) : LONGINT;
  1235. *
  1236. *   FUNCTION
  1237. *    JulianDayDiff gives you back the number of days between
  1238. *    two specified dates.
  1239. *
  1240. *   INPUTS
  1241. *    day1   - day of the first date
  1242. *    month1 - month of the first date
  1243. *    year1  - year of the first date
  1244. *    day2   - day of the second date
  1245. *    month2 - month of the second month
  1246. *    year2  - year of the second date
  1247. *
  1248. *   RESULT
  1249. *    days - The number of days between the two dates
  1250. *        (positive if date1 <= date2).
  1251. *
  1252. *   EXAMPLE
  1253. *    ...
  1254. *    days := JulianDayDiff(18,9,1970,22,1,1994);
  1255. *    WriteString("Age of Kai Hofmann in days : ");
  1256. *    WriteInt(days,10); WriteLn;
  1257. *    ...
  1258. *
  1259. *   NOTES
  1260. *    It is better only to use this function for years from -7 to 1582!
  1261. *
  1262. *   BUGS
  1263. *    No known bugs.
  1264. *
  1265. *   SEE ALSO
  1266. *    GregorianDayDiff(),HeisDayDiff(),JulianMonthDays(),JulianYearDays()
  1267. *
  1268. *****************************************************************************
  1269. *
  1270. *
  1271. *)
  1272.  
  1273.  VAR
  1274.     t1,t2 : LONGINT;
  1275.  
  1276.  BEGIN
  1277.    t1 := day1; (* set days left in the actual month *)
  1278.    t2 := day2;
  1279.  
  1280.    WHILE month1 > 1 DO (* calc days left by the gone month of the year1 *)
  1281.      DEC(month1);
  1282.      t1 := t1 + JulianMonthDays(month1,year1);
  1283.    END;
  1284.  
  1285.    WHILE month2 > 1 DO (* calc days left by the gone month of the year2 *)
  1286.      DEC(month2);
  1287.      t2 := t2 + JulianMonthDays(month2,year2);
  1288.    END;
  1289.  
  1290.    WHILE year1 > year2 DO (* calc days of diff years *)
  1291.      DEC(year1);
  1292.      t1 := t1 + JulianYearDays(year1);
  1293.    END;
  1294.  
  1295.    WHILE year1 < year2 DO (* calc days of diff years *)
  1296.      DEC(year2);
  1297.      t2 := t2 + JulianYearDays(year2);
  1298.    END;
  1299.  
  1300.    RETURN(t2-t1);
  1301.  END JulianDayDiff;
  1302.  
  1303.  
  1304.  PROCEDURE GregorianDayDiff*(day1,month1 : SHORTINT; year1 : INTEGER;
  1305.             day2,month2 : SHORTINT; year2 : INTEGER) : LONGINT;
  1306.  
  1307. (*
  1308. ******* Date/GregorianDayDiff ***********************************************
  1309. *
  1310. *   NAME
  1311. *    GregorianDayDiff -- Calculates the days between 2 dates. (V33)
  1312. *
  1313. *   SYNOPSIS
  1314. *    days := GregorianDayDiff(day1,month1,year1,day2,month2,year2);
  1315. *
  1316. *    PROCEDURE GregorianDayDiff(day1,month1 : SHORTINT; year1 : INTEGER;
  1317. *        day2,month2 : SHORTINT; year2 : INTEGER) : LONGINT;
  1318. *
  1319. *   FUNCTION
  1320. *    GregorianDayDiff gives you back the number of days between
  1321. *    two specified dates.
  1322. *
  1323. *   INPUTS
  1324. *    day1   - day of the first date
  1325. *    month1 - month of the first date
  1326. *    year1  - year of the first date
  1327. *    day2   - day of the second date
  1328. *    month2 - month of the second month
  1329. *    year2  - year of the second date
  1330. *
  1331. *   RESULT
  1332. *    days - The number of days between the two dates
  1333. *        (positive if date1 <= date2).
  1334. *
  1335. *   EXAMPLE
  1336. *    ...
  1337. *    days := GregorianDayDiff(18,9,1970,22,1,1994);
  1338. *    WriteString("Age of Kai Hofmann in days : ");
  1339. *    WriteInt(days,10); WriteLn;
  1340. *    ...
  1341. *
  1342. *   NOTES
  1343. *    It is better only to use this function for years from -7 to 3200!
  1344. *
  1345. *   BUGS
  1346. *    If you use on of the dates 5.10.1582 to 14.10.1582 you will get a
  1347. *    wrong output, because this days don't exist!
  1348. *
  1349. *   SEE ALSO
  1350. *    JulianDayDiff(),HeisDayDiff(),GregorianDaySmaller(),
  1351. *    GregorianDayGreater(),GregorianMonthDays(),GregorianYearDays()
  1352. *
  1353. *****************************************************************************
  1354. *
  1355. *
  1356. *)
  1357.  
  1358.  VAR
  1359.     t1,t2 : LONGINT;
  1360.  
  1361.  BEGIN
  1362.    t1 := day1; (* set days left in the actual month *)
  1363.    t2 := day2;
  1364.  
  1365.    IF (year1 = 1582) AND (month1 = 10) THEN
  1366.      IF (day1 < 5) AND GregorianDaySmaller(day1,month1,year1,day2,month2,year2) AND GregorianDaySmaller(day2,month2,year2,1,11,1582) AND GregorianDayGreater(day2,month2,year2,14,10,1582) THEN
  1367.        t2 := t2 - 10;
  1368.      END;
  1369.      IF day1 > 14 THEN
  1370.        IF GregorianDaySmaller(day1,month1,year1,day2,month2,year2) AND GregorianDayGreater(day2,month2,year2,31,10,1582) THEN
  1371.          t2 := t2 +10;
  1372.        END;
  1373.        IF GregorianDayGreater(day1,month1,year1,day2,month2,year2) AND GregorianDaySmaller(day2,month2,year2,5,10,1582) THEN
  1374.          t1 := t1 -10;
  1375.        END;
  1376.      END;
  1377.    END;
  1378.  
  1379.    IF (year2 = 1582) AND (month2 = 10) AND (day2 > 14) THEN
  1380.      IF GregorianDaySmaller(day2,month2,year2,day1,month1,year1) AND GregorianDayGreater(day1,month1,year1,31,10,1582) THEN
  1381.        t1 := t1 +10;
  1382.      END;
  1383.      IF GregorianDayGreater(day2,month2,year2,day1,month1,year1) AND GregorianDaySmaller(day1,month1,year1,1,10,1582) THEN
  1384.        t2 := t2 -10;
  1385.      END;
  1386.    END;
  1387.  
  1388.    WHILE month1 > 1 DO (* calc days left by the gone month of the year1 *)
  1389.      DEC(month1);
  1390.      t1 := t1 + GregorianMonthDays(month1,year1);
  1391.    END;
  1392.  
  1393.    WHILE month2 > 1 DO (* calc days left by the gone month of the year2 *)
  1394.      DEC(month2);
  1395.      t2 := t2 + GregorianMonthDays(month2,year2);
  1396.    END;
  1397.  
  1398.    WHILE year1 > year2 DO (* calc days of diff years *)
  1399.      DEC(year1);
  1400.      t1 := t1 + GregorianYearDays(year1);
  1401.    END;
  1402.  
  1403.    WHILE year1 < year2 DO (* calc days of diff years *)
  1404.      DEC(year2);
  1405.      t2 := t2 + GregorianYearDays(year2);
  1406.    END;
  1407.  
  1408.    RETURN(t2-t1);
  1409.  END GregorianDayDiff;
  1410.  
  1411.  
  1412.  PROCEDURE HeisDayDiff*(day1,month1 : SHORTINT; year1 : INTEGER;
  1413.             day2,month2 : SHORTINT; year2 : INTEGER) : LONGINT;
  1414.  
  1415. (*
  1416. ******* Date/HeisDayDiff ****************************************************
  1417. *
  1418. *   NAME
  1419. *    HeisDayDiff -- Calculates the days between 2 dates. (V33)
  1420. *
  1421. *   SYNOPSIS
  1422. *    days := HeisDayDiff(day1,month1,year1,day2,month2,year2);
  1423. *
  1424. *    PROCEDURE HeisDayDiff(day1,month1 : SHORTINT; year1 : INTEGER;
  1425. *        day2,month2 : SHORTINT; year2 : INTEGER) : LONGINT;
  1426. *
  1427. *   FUNCTION
  1428. *    HeisDayDiff gives you back the number of days between
  1429. *    two specified dates.
  1430. *
  1431. *   INPUTS
  1432. *    day1   - day of the first date
  1433. *    month1 - month of the first date
  1434. *    year1  - year of the first date
  1435. *    day2   - day of the second date
  1436. *    month2 - month of the second month
  1437. *    year2  - year of the second date
  1438. *
  1439. *   RESULT
  1440. *    days - The number of days between the two dates
  1441. *        (positive if date1 <= date2).
  1442. *
  1443. *   EXAMPLE
  1444. *    ...
  1445. *    days := HeisDayDiff(18,9,1970,22,1,1994);
  1446. *    WriteString("Age of Kai Hofmann in days : ");
  1447. *    WriteInt(days,10); WriteLn;
  1448. *    ...
  1449. *
  1450. *   NOTES
  1451. *    It is better only to use this function for years from -7 to 8000!
  1452. *
  1453. *   BUGS
  1454. *    If you use on of the dates 5.10.1582 to 14.10.1582 you will get a
  1455. *    wrong output, because this days don't exist!
  1456. *
  1457. *   SEE ALSO
  1458. *    JulianDayDiff(),GregorianDayDiff(),HeisDaySmaller(),HeisDayGreater(),
  1459. *    HeisMonthDays(),HeisYearDays()
  1460. *
  1461. *****************************************************************************
  1462. *
  1463. *
  1464. *)
  1465.  
  1466.  VAR
  1467.     t1,t2 : LONGINT;
  1468.  
  1469.  BEGIN
  1470.    t1 := day1; (* set days left in the actual month *)
  1471.    t2 := day2;
  1472.  
  1473.    IF (year1 = 1582) AND (month1 = 10) THEN
  1474.      IF (day1 < 5) AND HeisDaySmaller(day1,month1,year1,day2,month2,year2) AND HeisDaySmaller(day2,month2,year2,1,11,1582) AND HeisDayGreater(day2,month2,year2,14,10,1582) THEN
  1475.        t2 := t2 - 10;
  1476.      END;
  1477.      IF day1 > 14 THEN
  1478.        IF HeisDaySmaller(day1,month1,year1,day2,month2,year2) AND HeisDayGreater(day2,month2,year2,31,10,1582) THEN
  1479.          t2 := t2 +10;
  1480.        END;
  1481.        IF HeisDayGreater(day1,month1,year1,day2,month2,year2) AND HeisDaySmaller(day2,month2,year2,5,10,1582) THEN
  1482.          t1 := t1 -10;
  1483.        END;
  1484.      END;
  1485.    END;
  1486.  
  1487.    IF (year2 = 1582) AND (month2 = 10) AND (day2 > 14) THEN
  1488.      IF HeisDaySmaller(day2,month2,year2,day1,month1,year1) AND HeisDayGreater(day1,month1,year1,31,10,1582) THEN
  1489.        t1 := t1 +10;
  1490.      END;
  1491.      IF HeisDayGreater(day2,month2,year2,day1,month1,year1) AND HeisDaySmaller(day1,month1,year1,1,10,1582) THEN
  1492.        t2 := t2 -10;
  1493.      END;
  1494.    END;
  1495.  
  1496.    WHILE month1 > 1 DO (* calc days left by the gone month of the year1 *)
  1497.      DEC(month1);
  1498.      t1 := t1 + HeisMonthDays(month1,year1);
  1499.    END;
  1500.  
  1501.    WHILE month2 > 1 DO (* calc days left by the gone month of the year2 *)
  1502.      DEC(month2);
  1503.      t2 := t2 + HeisMonthDays(month2,year2);
  1504.    END;
  1505.  
  1506.    WHILE year1 > year2 DO (* calc days of diff years *)
  1507.      DEC(year1);
  1508.      t1 := t1 + HeisYearDays(year1);
  1509.    END;
  1510.  
  1511.    WHILE year1 < year2 DO (* calc days of diff years *)
  1512.      DEC(year2);
  1513.      t2 := t2 + HeisYearDays(year2);
  1514.    END;
  1515.  
  1516.    RETURN(t2-t1);
  1517.  END HeisDayDiff;
  1518.  
  1519.  (* ----------------------------------------------------------------------- *)
  1520.  
  1521.  PROCEDURE JulianWeekday*(day,month : SHORTINT; year : INTEGER) : Weekdays;
  1522.  
  1523. (*
  1524. ******* Date/JulianWeekday **************************************************
  1525. *
  1526. *   NAME
  1527. *    JulianWeekday -- Gets the weekday of a specified date. (V33)
  1528. *
  1529. *   SYNOPSIS
  1530. *    weekday := JulianWeekday(day,month,year);
  1531. *
  1532. *    PROCEDURE JulianWeekday(day,month : SHORTINT;
  1533. *        year : INTEGER) : Weekday;
  1534. *
  1535. *   FUNCTION
  1536. *    JulianWeekday gets the weekday for a specified date.
  1537. *
  1538. *   INPUTS
  1539. *    day   - day of the date
  1540. *    month - month of the date
  1541. *    year  - year of the date
  1542. *
  1543. *   RESULT
  1544. *    weekday - This result is of type:
  1545. *        Weekdays = (dayerr,Monday,Tuesday,Wednesday,Thursday,Friday,
  1546. *        Saturday,Sunday);
  1547. *        dayerr will show you, that an error occurs!
  1548. *
  1549. *   EXAMPLE
  1550. *    ...
  1551. *    weekday := JulianWeekday(4,10,1582);
  1552. *    IF weekday = dayerr THEN
  1553. *    ...
  1554. *    END;
  1555. *    ...
  1556. *
  1557. *   NOTES
  1558. *    It is better only to use this function for years from 0 to 1582!
  1559. *    In this version no dayerr will occur!
  1560. *
  1561. *   BUGS
  1562. *    For years < 0 errors could occur, or systemcrashs(?).
  1563. *
  1564. *   SEE ALSO
  1565. *    GregorianWeekday(),HeisWeekday()
  1566. *
  1567. *****************************************************************************
  1568. *
  1569. *
  1570. *)
  1571.  
  1572.  VAR
  1573.     decade,wday    : SHORTINT;
  1574.  
  1575.  BEGIN
  1576.    (* January and february dates must be 13 and 14 of the year before! *)
  1577.    IF month IN {1,2} THEN
  1578.      month := 12 + month;
  1579.      DEC(year);
  1580.    END;
  1581.    decade := SHORT(year - ((year DIV 100) * 100));
  1582.    (* Formula from Ch. Zeller in 1877 *)
  1583.    wday := (day + (((month+1) * 26) DIV 10) + decade + (decade DIV 4)
  1584.                     + 5 - SHORT(year DIV 100)) MOD 7;
  1585.    (* Convert (1-su 2-mo 3-tu 4-we 5-th 6-fr 7/0-sa) to normal days *)
  1586.    IF wday = 0 THEN
  1587.      wday := 6;
  1588.    ELSE
  1589.      DEC(wday);
  1590.      IF wday = 0 THEN
  1591.        wday := 7;
  1592.      END;
  1593.    END;
  1594.    RETURN(wday);
  1595.  END JulianWeekday;
  1596.  
  1597.  
  1598.  PROCEDURE GregorianWeekday*(day,month : SHORTINT; year : INTEGER) : Weekdays;
  1599.  
  1600. (*
  1601. ******* Date/GregorianWeekday ***********************************************
  1602. *
  1603. *   NAME
  1604. *    GregorianWeekday -- Gets the weekday of a specified date. (V33)
  1605. *
  1606. *   SYNOPSIS
  1607. *    weekday := GregorianWeekday(day,month,year);
  1608. *
  1609. *    PROCEDURE GregorianWeekday(day,month : SHORTINT;
  1610. *        year : INTEGER) : Weekday;
  1611. *
  1612. *   FUNCTION
  1613. *    GregorianWeekday gets the weekday for a specified date.
  1614. *
  1615. *   INPUTS
  1616. *    day   - day of the date
  1617. *    month - month of the date
  1618. *    year  - year of the date
  1619. *
  1620. *   RESULT
  1621. *    weekday - This result is of type:
  1622. *        Weekdays = (dayerr,Monday,Tuesday,Wednesday,Thursday,Friday,
  1623. *        Saturday,Sunday);
  1624. *        dayerr will show you, that an error occurs!
  1625. *
  1626. *   EXAMPLE
  1627. *    ...
  1628. *    weekday := GregorianWeekday(22,1,1994);
  1629. *    IF weekday = dayerr THEN
  1630. *    ...
  1631. *    END;
  1632. *    ...
  1633. *
  1634. *   NOTES
  1635. *    It is better only to use this function for years from -7 to 3200!
  1636. *    In this version dayerr will only occur for the lost days :)
  1637. *
  1638. *   BUGS
  1639. *    It's not possible to use years < 0 (for more see JulianWeekday()).
  1640. *
  1641. *   SEE ALSO
  1642. *    JulianWeekday(),HeisWeekday(),GregorianDaySmaller(),
  1643. *    GregorianLeapYear()
  1644. *
  1645. *****************************************************************************
  1646. *
  1647. *
  1648. *)
  1649.  
  1650.  VAR
  1651.     weekday    : Weekdays;
  1652.     wd    : INTEGER;
  1653.  
  1654.  BEGIN
  1655.    IF GregorianDaySmaller(day,month,year,BeforeGregorianDay+1,
  1656.                 BeforeGregorianMonth,BeforeGregorianYear) THEN
  1657.      RETURN(JulianWeekday(day,month,year));
  1658.    ELSIF GregorianDaySmaller(day,month,year,AfterGregorianDay,
  1659.                 AfterGregorianMonth,AfterGregorianYear) THEN
  1660.      RETURN(dayerr);
  1661.    ELSE
  1662.      (* Formula from J. I. Perelman 1909 *)
  1663.      wd := SHORT(year + (year DIV 4) - (year DIV 100) + (year DIV 400)
  1664.                 + GregorianDayDiff(1,1,year,day,month,year));
  1665.      IF GregorianLeapYear(year) THEN
  1666.        DEC(wd);
  1667.      END;
  1668.      weekday := SHORT(wd MOD 7);
  1669.      IF weekday = dayerr THEN
  1670.        weekday := Sunday;
  1671.      END;
  1672.      RETURN(weekday);
  1673.    END;
  1674.  END GregorianWeekday;
  1675.  
  1676.  
  1677.  PROCEDURE HeisWeekday*(day,month : SHORTINT; year : INTEGER) : Weekdays;
  1678.  
  1679. (*
  1680. ******* Date/HeisWeekday ****************************************************
  1681. *
  1682. *   NAME
  1683. *    HeisWeekday -- Gets the weekday of a specified date. (V33)
  1684. *
  1685. *   SYNOPSIS
  1686. *    weekday := HeisWeekday(day,month,year);
  1687. *
  1688. *    PROCEDURE HeisWeekday(day,month : SHORTINT;
  1689. *        year : INTEGER) : Weekday;
  1690. *
  1691. *   FUNCTION
  1692. *    HeisWeekday gets the weekday for a specified date.
  1693. *
  1694. *   INPUTS
  1695. *    day   - day of the date
  1696. *    month - month of the date
  1697. *    year  - year of the date
  1698. *
  1699. *   RESULT
  1700. *    weekday - This result is of type:
  1701. *        Weekdays = (dayerr,Monday,Tuesday,Wednesday,Thursday,Friday,
  1702. *        Saturday,Sunday);
  1703. *        dayerr will show you, that an error occurs!
  1704. *
  1705. *   EXAMPLE
  1706. *    ...
  1707. *    weekday := HeisWeekday(22,1,1994);
  1708. *    IF weekday = dayerr THEN
  1709. *    ...
  1710. *    END;
  1711. *    ...
  1712. *
  1713. *   NOTES
  1714. *    It is better only to use this function for years from -7 to 8000!
  1715. *    In this version dayerr will only occur for the lost days :)
  1716. *
  1717. *   BUGS
  1718. *    It is not possible to use year < 0 (see JulianWeekday() for more).
  1719. *
  1720. *   SEE ALSO
  1721. *    JulianWeekday(),GregorianWeekday(),HeisDaySmaller(),HeisLeapYear()
  1722. *
  1723. *****************************************************************************
  1724. *
  1725. *
  1726. *)
  1727.  
  1728.  VAR
  1729.     weekday    : Weekdays;
  1730.     wd    : INTEGER;
  1731.  
  1732.  BEGIN
  1733.    IF HeisDaySmaller(day,month,year,StartHeisDay,
  1734.                 StartHeisMonth,StartHeisYear) THEN
  1735.      RETURN(GregorianWeekday(day,month,year));
  1736.    ELSE
  1737.      (* Formula from J. I. Perelman 1909 - extended for N.Heis in 01.1994
  1738.     by Kai Hofmann *)
  1739.      wd := SHORT(year + (year DIV 4) - (year DIV 100) + (year DIV 400)
  1740.         - (year DIV 3200) + HeisDayDiff(1,1,year,day,month,year));
  1741.      IF HeisLeapYear(year) THEN
  1742.        DEC(wd);
  1743.      END;
  1744.      weekday := SHORT(wd MOD 7);
  1745.      IF weekday = dayerr THEN
  1746.        weekday := Sunday;
  1747.      END;
  1748.      RETURN(weekday);
  1749.    END;
  1750.  END HeisWeekday;
  1751.  
  1752.  (* ----------------------------------------------------------------------- *)
  1753.  
  1754.  PROCEDURE JulianDaysBeforeWeekday*(day,month : SHORTINT;
  1755.             year : INTEGER; weekday : Weekdays) : SHORTINT;
  1756.  
  1757. (*
  1758. ******* Date/JulianDaysBeforeWeekday ****************************************
  1759. *
  1760. *   NAME
  1761. *    JulianDaysBeforeWeekday -- Returns the diff to the wday before. (V33)
  1762. *
  1763. *   SYNOPSIS
  1764. *    days := JulianDaysBeforeWeekday(day,month,year,weekday);
  1765. *
  1766. *    PROCEDURE JulianDaysBeforeWeekday(day,month : SHORTINT;
  1767. *        year : INTEGER; weekday : Weekdays) : SHORTINT;
  1768. *
  1769. *   FUNCTION
  1770. *    Returns the days to the weekday before the specified date.
  1771. *    So if you specify the 22.1.1994 (Saturday) and Thursday
  1772. *    you get back 2!
  1773. *    If you specify the 22.1.1994 and Saturday you get back 0
  1774. *    (the same day)!
  1775. *
  1776. *   INPUTS
  1777. *    day     - day of the date
  1778. *    month   - month of the date
  1779. *    year    - year of the date
  1780. *    weekday - weekday to search for building difference
  1781. *
  1782. *   RESULT
  1783. *    days - The days back to the searched weekday (0-6)
  1784. *        If you get back 8 an error occurs!
  1785. *
  1786. *   EXAMPLE
  1787. *    ...
  1788. *    days := JulianDaysBeforeWeekday(22,1,1994,Thursday);
  1789. *    ...
  1790. *
  1791. *   NOTES
  1792. *    It is better to use this function only from -7 to 1582!
  1793. *
  1794. *   BUGS
  1795. *    See JulianWeekday()!
  1796. *
  1797. *   SEE ALSO
  1798. *    GregorianDaysBeforeWeekday(),HeisDaysBeforeWeekday(),JulianWeekday()
  1799. *
  1800. *****************************************************************************
  1801. *
  1802. *
  1803. *)
  1804.  
  1805.  VAR
  1806.     wday    : Weekdays;
  1807.  
  1808.  BEGIN
  1809.    IF weekday = dayerr THEN
  1810.      RETURN(8);
  1811.    ELSE
  1812.      wday := JulianWeekday(day,month,year);
  1813.      IF wday >= weekday THEN
  1814.        RETURN(wday-weekday);
  1815.      ELSE (* wday < weekday *)
  1816.        RETURN(7-weekday+wday);
  1817.      END;
  1818.    END;
  1819.  END JulianDaysBeforeWeekday;
  1820.  
  1821.  
  1822.  PROCEDURE GregorianDaysBeforeWeekday*(day,month : SHORTINT;
  1823.             year : INTEGER; weekday : Weekdays) : SHORTINT;
  1824.  
  1825. (*
  1826. ******* Date/GregorianDaysBeforeWeekday *************************************
  1827. *
  1828. *   NAME
  1829. *    GregorianDaysBeforeWeekday -- Returns the diff to wday before. (V33)
  1830. *
  1831. *   SYNOPSIS
  1832. *    days := GregorianDaysBeforeWeekday(day,month,year,weekday);
  1833. *
  1834. *    PROCEDURE GregorianDaysBeforeWeekday(day,month : SHORTINT;
  1835. *        year : INTEGER; weekday : Weekdays) : SHORTINT;
  1836. *
  1837. *   FUNCTION
  1838. *    Returns the days to the weekday before the specified date.
  1839. *    So if you specify the 22.1.1994 (Saturday) and Thursday
  1840. *    you get back 2!
  1841. *    If you specify the 22.1.1994 and Saturday you get back 0
  1842. *    (the same day)!
  1843. *
  1844. *   INPUTS
  1845. *    day     - day of the date
  1846. *    month   - month of the date
  1847. *    year    - year of the date
  1848. *    weekday - weekday to search for building difference
  1849. *
  1850. *   RESULT
  1851. *    days - The days back to the searched weekday (1-7)
  1852. *        If you get back 8 an error occurs!
  1853. *
  1854. *   EXAMPLE
  1855. *    ...
  1856. *    days := GregorianDaysBeforeWeekday(22,1,1994,Thursday);
  1857. *    ...
  1858. *
  1859. *   NOTES
  1860. *    It is better to use this function only from -7 to 3200!
  1861. *
  1862. *   BUGS
  1863. *    See GregorianWeekday()!
  1864. *
  1865. *   SEE ALSO
  1866. *    JulianDaysBeforeWeekday(),HeisDaysBeforeWekday(),GregorianWeekday()
  1867. *
  1868. *****************************************************************************
  1869. *
  1870. *
  1871. *)
  1872.  
  1873.  VAR
  1874.     wday    : Weekdays;
  1875.  
  1876.  BEGIN
  1877.    IF weekday = dayerr THEN
  1878.      RETURN(8);
  1879.    ELSE
  1880.      wday := GregorianWeekday(day,month,year);
  1881.      IF wday >= weekday THEN
  1882.        RETURN(wday-weekday);
  1883.      ELSE (* wday < weekday *)
  1884.        RETURN(7-weekday+wday);
  1885.      END;
  1886.    END;
  1887.  END GregorianDaysBeforeWeekday;
  1888.  
  1889.  
  1890.  PROCEDURE HeisDaysBeforeWeekday*(day,month : SHORTINT;
  1891.             year : INTEGER; weekday : Weekdays) : SHORTINT;
  1892.  
  1893. (*
  1894. ******* Date/HeisDaysBeforeWeekday ******************************************
  1895. *
  1896. *   NAME
  1897. *    HeisDaysBeforeWeekday -- Returns the diff to wday before. (V33)
  1898. *
  1899. *   SYNOPSIS
  1900. *    days := HeisDaysBeforeWeekday(day,month,year,weekday);
  1901. *
  1902. *    PROCEDURE HeisDaysBeforeWeekday(day,month : SHORTINT;
  1903. *        year : INTEGER; weekday : Weekdays) : SHORTINT;
  1904. *
  1905. *   FUNCTION
  1906. *    Returns the days to the weekday before the specified date.
  1907. *    So if you specify the 22.1.1994 (Saturday) and Thursday
  1908. *    you get back 2!
  1909. *    If you specify the 22.1.1994 and Saturday you get back 0
  1910. *    (the same day)!
  1911. *
  1912. *   INPUTS
  1913. *    day     - day of the date
  1914. *    month   - month of the date
  1915. *    year    - year of the date
  1916. *    weekday - weekday to search for building difference
  1917. *
  1918. *   RESULT
  1919. *    days - The days back to the searched weekday (1-7)
  1920. *        If you get back 8 an error occurs!
  1921. *
  1922. *   EXAMPLE
  1923. *    ...
  1924. *    days := HeisDaysBeforeWeekday(22,1,1994,Thursday);
  1925. *    ...
  1926. *
  1927. *   NOTES
  1928. *    It is better to use this function only from -7 to 8000!
  1929. *
  1930. *   BUGS
  1931. *    See HeisWeekday()!
  1932. *
  1933. *   SEE ALSO
  1934. *    JulianDaysBeforeWeekday(),GregorianDaysBeforeWeekday(),HeisWeekday()
  1935. *
  1936. *****************************************************************************
  1937. *
  1938. *
  1939. *)
  1940.  
  1941.  VAR
  1942.     wday    : Weekdays;
  1943.  
  1944.  BEGIN
  1945.    IF weekday = dayerr THEN
  1946.      RETURN(8);
  1947.    ELSE
  1948.      wday := HeisWeekday(day,month,year);
  1949.      IF wday >= weekday THEN
  1950.        RETURN(wday-weekday);
  1951.      ELSE (* wday < weekday *)
  1952.        RETURN(7-weekday+wday);
  1953.      END;
  1954.    END;
  1955.  END HeisDaysBeforeWeekday;
  1956.  
  1957.  (* ----------------------------------------------------------------------- *)
  1958.  
  1959.  PROCEDURE JulianDaysAfterWeekday*(day,month : SHORTINT;
  1960.             year : INTEGER; weekday : Weekdays) : SHORTINT;
  1961.  
  1962. (*
  1963. ******* Date/JulianDaysAfterWeekday *****************************************
  1964. *
  1965. *   NAME
  1966. *    JulianDaysAfterWeekday -- Returns the diff to the wday after. (V33)
  1967. *
  1968. *   SYNOPSIS
  1969. *    days := JulianDaysAfterWeekday(day,month,year,weekday);
  1970. *
  1971. *    PROCEDURE JulianDaysAfterWeekday(day,month : SHORTINT;
  1972. *        year : INTEGER; weekday : Weekdays) : SHORTINT;
  1973. *
  1974. *   FUNCTION
  1975. *    Returns the days to the weekday after the specified date.
  1976. *    So if you specify the 22.1.1994 (Saturday) and Thursday
  1977. *    you get back 5!
  1978. *    If you specify the 22.1.1994 and Saturday you get back 0
  1979. *    (the same day)!
  1980. *
  1981. *   INPUTS
  1982. *    day     - day of the date
  1983. *    month   - month of the date
  1984. *    year    - year of the date
  1985. *    weekday - weekday to search for building difference
  1986. *
  1987. *   RESULT
  1988. *    days - The days after to the searched weekday.
  1989. *
  1990. *   EXAMPLE
  1991. *    ...
  1992. *    days := JulianDaysAfterWeekday(22,1,1994,Thursday);
  1993. *    ...
  1994. *
  1995. *   NOTES
  1996. *    It is better to use this function only from -7 to 1582!
  1997. *
  1998. *   BUGS
  1999. *    See JulianWeekday()!
  2000. *
  2001. *   SEE ALSO
  2002. *    GregorianDaysAfterWeekday(),HeisDaysAfterWeekday(),JulianWeekday()
  2003. *
  2004. *****************************************************************************
  2005. *
  2006. *
  2007. *)
  2008.  
  2009.  VAR
  2010.     wday    : Weekdays;
  2011.  
  2012.  BEGIN
  2013.    IF weekday = dayerr THEN
  2014.      RETURN(8);
  2015.    ELSE
  2016.      wday := JulianWeekday(day,month,year);
  2017.      IF wday <= weekday THEN
  2018.        RETURN(weekday-wday);
  2019.      ELSE (* wday > weekday *)
  2020.        RETURN(7-wday+weekday);
  2021.      END;
  2022.    END;
  2023.  END JulianDaysAfterWeekday;
  2024.  
  2025.  
  2026.  PROCEDURE GregorianDaysAfterWeekday*(day,month : SHORTINT;
  2027.             year : INTEGER; weekday : Weekdays) : SHORTINT;
  2028.  
  2029. (*
  2030. ******* Date/GregorianDaysAfterWeekday **************************************
  2031. *
  2032. *   NAME
  2033. *    GregorianDaysAfterWeekday -- Returns the diff to wday after. (V33)
  2034. *
  2035. *   SYNOPSIS
  2036. *    days := GregorianDaysAfterWeekday(day,month,year,weekday);
  2037. *
  2038. *    PROCEDURE GregorianDaysAfterWeekday(day,month : SHORTINT;
  2039. *        year : INTEGER; weekday : Weekdays) : SHORTINT;
  2040. *
  2041. *   FUNCTION
  2042. *    Returns the days to the weekday after the specified date.
  2043. *    So if you specify the 22.1.1994 (Saturday) and Thursday
  2044. *    you get back 5!
  2045. *    If you specify the 22.1.1994 and Saturday you get back 0
  2046. *    (the same day)!
  2047. *
  2048. *   INPUTS
  2049. *    day     - day of the date
  2050. *    month   - month of the date
  2051. *    year    - year of the date
  2052. *    weekday - weekday to search for building difference
  2053. *
  2054. *   RESULT
  2055. *    days - The days after to the searched weekday.
  2056. *
  2057. *   EXAMPLE
  2058. *    ...
  2059. *    days := GregorianDaysAfterWeekday(22,1,1994,Thursday);
  2060. *    ...
  2061. *
  2062. *   NOTES
  2063. *    It is better to use this function only from -7 to 3200!
  2064. *
  2065. *   BUGS
  2066. *    See GregorianWeekday()!
  2067. *
  2068. *   SEE ALSO
  2069. *    JulianDaysAfterWeekday(),HeisDaysAfterWeekday(),GregorianWeekday()
  2070. *
  2071. *****************************************************************************
  2072. *
  2073. *
  2074. *)
  2075.  
  2076.  VAR
  2077.     wday    : Weekdays;
  2078.  
  2079.  BEGIN
  2080.    IF weekday = dayerr THEN
  2081.      RETURN(8);
  2082.    ELSE
  2083.      wday := GregorianWeekday(day,month,year);
  2084.      IF wday <= weekday THEN
  2085.        RETURN(weekday-wday);
  2086.      ELSE (* wday > weekday *)
  2087.        RETURN(7-wday+weekday);
  2088.      END;
  2089.    END;
  2090.  END GregorianDaysAfterWeekday;
  2091.  
  2092.  
  2093.  PROCEDURE HeisDaysAfterWeekday*(day,month : SHORTINT;
  2094.             year : INTEGER; weekday : Weekdays) : SHORTINT;
  2095.  
  2096. (*
  2097. ******* Date/HeisDaysAfterWeekday *******************************************
  2098. *
  2099. *   NAME
  2100. *    HeisDaysAfterWeekday -- Returns the diff to the wday after. (V33)
  2101. *
  2102. *   SYNOPSIS
  2103. *    days := HeisDaysAfterWeekday(day,month,year,weekday);
  2104. *
  2105. *    PROCEDURE HeisDaysAfterWeekday(day,month : SHORTINT;
  2106. *        year : INTEGER; weekday : Weekdays) : SHORTINT;
  2107. *
  2108. *   FUNCTION
  2109. *    Returns the days to the weekday after the specified date.
  2110. *    So if you specify the 22.1.1994 (Saturday) and Thursday
  2111. *    you get back 5!
  2112. *    If you specify the 22.1.1994 and Saturday you get back 0
  2113. *    (the same day)!
  2114. *
  2115. *   INPUTS
  2116. *    day     - day of the date
  2117. *    month   - month of the date
  2118. *    year    - year of the date
  2119. *    weekday - weekday to search for building difference
  2120. *
  2121. *   RESULT
  2122. *    days - The days after to the searched weekday.
  2123. *
  2124. *   EXAMPLE
  2125. *    ...
  2126. *    days := HeisDaysAfterWeekday(22,1,1994,Thursday);
  2127. *    ...
  2128. *
  2129. *   NOTES
  2130. *    It is better to use this function only from -7 to 8000!
  2131. *
  2132. *   BUGS
  2133. *    See HeisWeekday()!
  2134. *
  2135. *   SEE ALSO
  2136. *    JulianDaysAfterWeekday(),GregorianDaysAfterWeekday(),HeisWeekday()
  2137. *
  2138. *****************************************************************************
  2139. *
  2140. *
  2141. *)
  2142.  
  2143.  VAR
  2144.     wday    : Weekdays;
  2145.  
  2146.  BEGIN
  2147.    IF weekday = dayerr THEN
  2148.      RETURN(8);
  2149.    ELSE
  2150.      wday := HeisWeekday(day,month,year);
  2151.      IF wday <= weekday THEN
  2152.        RETURN(weekday-wday);
  2153.      ELSE (* wday > weekday *)
  2154.        RETURN(7-wday+weekday);
  2155.      END;
  2156.    END;
  2157.  END HeisDaysAfterWeekday;
  2158.  
  2159.  (* ----------------------------------------------------------------------- *)
  2160.  
  2161.  PROCEDURE JulianDiffDate*(day,month : SHORTINT;
  2162.     year,days : INTEGER; VAR dday,dmonth : SHORTINT; VAR dyear : INTEGER);
  2163.  
  2164. (*
  2165. ******* Date/JulianDiffDate *************************************************
  2166. *
  2167. *   NAME
  2168. *    JulianDiffDate -- Returns the date for a diff to another date. (V33)
  2169. *
  2170. *   SYNOPSIS
  2171. *    JulianDiffDate(day,month,year,diffdays,dday,dmonth,dyear);
  2172. *
  2173. *    PROCEDURE JulianDiffDate(day,month : SHORTINT; year,days : INTEGER;
  2174. *        VAR dday,dmonth : SHORTINT; VAR dyear : INTEGER);
  2175. *
  2176. *   FUNCTION
  2177. *    Returns the date wich lies diffdays before/after the specified date.
  2178. *
  2179. *   INPUTS
  2180. *    day      - day of the date
  2181. *    month    - month of the date
  2182. *    year     - year of the date
  2183. *    diffdays - difference to the date in days
  2184. *
  2185. *   RESULT
  2186. *    dday   - Destination day
  2187. *    dmonth - Destination month
  2188. *    dyear  - Destination year
  2189. *
  2190. *   EXAMPLE
  2191. *    ...
  2192. *    JulianDiffDate(23,1,1994,7,dday,dmonth,dyear);
  2193. *    ...
  2194. *
  2195. *   NOTES
  2196. *    It is better to use this function only from -7 to 1582!
  2197. *
  2198. *   BUGS
  2199. *    unknown.
  2200. *
  2201. *   SEE ALSO
  2202. *    GregorianDiffDate(),HeisDiffDate(),JulianDayDiff(),JulianMonthDays()
  2203. *
  2204. *****************************************************************************
  2205. *
  2206. *
  2207. *)
  2208.  
  2209.  VAR
  2210.     ddays    : INTEGER;
  2211.  
  2212.  BEGIN
  2213.    dday := day;
  2214.    dmonth := month;
  2215.    dyear := year;
  2216.    IF days >= 0 THEN (* add *)
  2217.      ddays := SHORT(JulianDayDiff(dday,dmonth,dyear,1,1,dyear+1));
  2218.      WHILE days >= ddays DO (* years *)
  2219.        dday := 1;
  2220.        dmonth := 1;
  2221.        INC(dyear);
  2222.        days := SHORT(days - ddays);
  2223.        ddays := SHORT(JulianDayDiff(dday,dmonth,dyear,1,1,dyear+1));
  2224.      END;
  2225.      ddays := SHORT(JulianDayDiff(dday,dmonth,dyear,1,dmonth+1,dyear));
  2226.      WHILE days >= ddays DO (* months *)
  2227.        dday := 1;
  2228.        INC(dmonth);
  2229.        days := days - ddays;
  2230.        ddays := SHORT(JulianDayDiff(dday,dmonth,dyear,1,dmonth+1,dyear));
  2231.      END;
  2232.      IF days > 0 THEN (* days *)
  2233.        dday := SHORT(dday + days);
  2234.      END;
  2235.    ELSE (* sub *)
  2236.      ddays := SHORT(JulianDayDiff(dday,dmonth,dyear,31,12,dyear-1));
  2237.      WHILE days <= ddays DO (* years *)
  2238.        dday := 31;
  2239.        dmonth := 12;
  2240.        DEC(dyear);
  2241.        days := days - ddays;
  2242.        ddays := SHORT(JulianDayDiff(dday,dmonth,dyear,31,12,dyear-1));
  2243.      END;
  2244.      ddays := SHORT(JulianDayDiff(dday,dmonth,dyear,JulianMonthDays(dmonth-1,dyear),dmonth-1,dyear));
  2245.      WHILE days <= ddays DO (* months *)
  2246.        dday := JulianMonthDays(dmonth-1,dyear);
  2247.        DEC(dmonth);
  2248.        days := days - ddays;
  2249.        ddays := SHORT(JulianDayDiff(dday,dmonth,dyear,JulianMonthDays(dmonth-1,dyear),dmonth-1,dyear));
  2250.      END;
  2251.      IF days < 0 THEN
  2252.        dday := SHORT(dday - ABS(days));
  2253.      END;
  2254.    END;
  2255.  END JulianDiffDate;
  2256.  
  2257.  
  2258.  PROCEDURE GregorianDiffDate*(day,month : SHORTINT;
  2259.     year,days : INTEGER; VAR dday,dmonth : SHORTINT; VAR dyear : INTEGER);
  2260.  
  2261. (*
  2262. ******* Date/GregorianDiffDate **********************************************
  2263. *
  2264. *   NAME
  2265. *    GregorianDiffDate -- Returns the diff date to another date. (V33)
  2266. *
  2267. *   SYNOPSIS
  2268. *    GregorianDiffDate(day,month,year,diffdays,dday,dmonth,dyear);
  2269. *
  2270. *    PROCEDURE GregorianDiffDate(day,month : SHORTINT;
  2271. *        year,days : INTEGER; VAR dday,dmonth : SHORTINT;
  2272. *        VAR dyear : INTEGER);
  2273. *
  2274. *   FUNCTION
  2275. *    Returns the date wich lies diffdays before/after the specified date.
  2276. *
  2277. *   INPUTS
  2278. *    day      - day of the date
  2279. *    month    - month of the date
  2280. *    year     - year of the date
  2281. *    diffdays - difference to the date in days
  2282. *
  2283. *   RESULT
  2284. *    dday   - Destination day
  2285. *    dmonth - Destination month
  2286. *    dyear  - Destination year
  2287. *
  2288. *   EXAMPLE
  2289. *    ...
  2290. *    GregorianDiffDate(23,1,1994,7,dday,dmonth,dyear);
  2291. *    ...
  2292. *
  2293. *   NOTES
  2294. *    It is better to use this function only from -7 to 3200!
  2295. *
  2296. *   BUGS
  2297. *    unknown.
  2298. *
  2299. *   SEE ALSO
  2300. *    JulianDiffDate(),HeisDiffDate(),GregoriandayDiff(),
  2301. *    GregorianMonthDays()
  2302. *
  2303. *****************************************************************************
  2304. *
  2305. *
  2306. *)
  2307.  
  2308.  VAR
  2309.     ddays    : INTEGER;
  2310.  
  2311.  BEGIN
  2312.    dday := day;
  2313.    dmonth := month;
  2314.    dyear := year;
  2315.    IF days >= 0 THEN (* add *)
  2316.      ddays := SHORT(GregorianDayDiff(dday,dmonth,dyear,1,1,dyear+1));
  2317.      WHILE days >= ddays DO (* years *)
  2318.        dday := 1;
  2319.        dmonth := 1;
  2320.        INC(dyear);
  2321.        days := days - ddays;
  2322.        ddays := SHORT(GregorianDayDiff(dday,dmonth,dyear,1,1,dyear+1));
  2323.      END;
  2324.      ddays := SHORT(GregorianDayDiff(dday,dmonth,dyear,1,dmonth+1,dyear));
  2325.      WHILE days >= ddays DO (* months *)
  2326.        dday := 1;
  2327.        INC(dmonth);
  2328.        days := days - ddays;
  2329.        ddays := SHORT(GregorianDayDiff(dday,dmonth,dyear,1,dmonth+1,dyear));
  2330.      END;
  2331.      IF days > 0 THEN (* days *)
  2332.        dday := SHORT(dday + days);
  2333.      END;
  2334.    ELSE (* sub *)
  2335.      ddays := SHORT(GregorianDayDiff(dday,dmonth,dyear,31,12,dyear-1));
  2336.      WHILE days <= ddays DO (* years *)
  2337.        dday := 31;
  2338.        dmonth := 12;
  2339.        DEC(dyear);
  2340.        days := days - ddays;
  2341.        ddays := SHORT(GregorianDayDiff(dday,dmonth,dyear,31,12,dyear-1));
  2342.      END;
  2343.      ddays := SHORT(GregorianDayDiff(dday,dmonth,dyear,GregorianMonthDays(dmonth-1,dyear),dmonth-1,dyear));
  2344.      WHILE days <= ddays DO (* months *)
  2345.        dday := GregorianMonthDays(dmonth-1,dyear);
  2346.        DEC(dmonth);
  2347.        days := days - ddays;
  2348.        ddays := SHORT(GregorianDayDiff(dday,dmonth,dyear,GregorianMonthDays(dmonth-1,dyear),dmonth-1,dyear));
  2349.      END;
  2350.      IF days < 0 THEN
  2351.        dday := SHORT(dday - ABS(days));
  2352.      END;
  2353.    END;
  2354.  END GregorianDiffDate;
  2355.  
  2356.  
  2357.  PROCEDURE HeisDiffDate*(day,month : SHORTINT; year,days : INTEGER;
  2358.             VAR dday,dmonth : SHORTINT; VAR dyear : INTEGER);
  2359.  
  2360. (*
  2361. ******* Date/HeisDiffDate ***************************************************
  2362. *
  2363. *   NAME
  2364. *    HeisDiffDate -- Returns the date for a diff to another date. (V33)
  2365. *
  2366. *   SYNOPSIS
  2367. *    HeisDiffDate(day,month,year,diffdays,dday,dmonth,dyear);
  2368. *
  2369. *    PROCEDURE HeisDiffDate(day,month : SHORTINT; year,days : INTEGER;
  2370. *         VAR dday,dmonth : SHORTINT; VAR dyear : INTEGER);
  2371. *
  2372. *   FUNCTION
  2373. *    Returns the date wich lies diffdays before/after the specified date.
  2374. *
  2375. *   INPUTS
  2376. *    day      - day of the date
  2377. *    month    - month of the date
  2378. *    year     - year of the date
  2379. *    diffdays - difference to the date in days
  2380. *
  2381. *   RESULT
  2382. *    dday   - Destination day
  2383. *    dmonth - Destination month
  2384. *    dyear  - Destination year
  2385. *
  2386. *   EXAMPLE
  2387. *    ...
  2388. *    HeisDiffDate(23,1,1994,7,dday,dmonth,dyear);
  2389. *    ...
  2390. *
  2391. *   NOTES
  2392. *    It is better to use this function only from -7 to 8000!
  2393. *
  2394. *   BUGS
  2395. *    unknown.
  2396. *
  2397. *   SEE ALSO
  2398. *    JuliandiffDate(),GregorianDiffdate(),HeisDayDiff(),HeisMonthDays()
  2399. *
  2400. *****************************************************************************
  2401. *
  2402. *
  2403. *)
  2404.  
  2405.  VAR
  2406.     ddays    : INTEGER;
  2407.  
  2408.  BEGIN
  2409.    dday := day;
  2410.    dmonth := month;
  2411.    dyear := year;
  2412.    IF days >= 0 THEN (* add *)
  2413.      ddays := SHORT(HeisDayDiff(dday,dmonth,dyear,1,1,dyear+1));
  2414.      WHILE days >= ddays DO (* years *)
  2415.        dday := 1;
  2416.        dmonth := 1;
  2417.        INC(dyear);
  2418.        days := days - ddays;
  2419.        ddays := SHORT(HeisDayDiff(dday,dmonth,dyear,1,1,dyear+1));
  2420.      END;
  2421.      ddays := SHORT(HeisDayDiff(dday,dmonth,dyear,1,dmonth+1,dyear));
  2422.      WHILE days >= ddays DO (* months *)
  2423.        dday := 1;
  2424.        INC(dmonth);
  2425.        days := days - ddays;
  2426.        ddays := SHORT(HeisDayDiff(dday,dmonth,dyear,1,dmonth+1,dyear));
  2427.      END;
  2428.      IF days > 0 THEN (* days *)
  2429.        dday := SHORT(dday + days);
  2430.      END;
  2431.    ELSE (* sub *)
  2432.      ddays := SHORT(HeisDayDiff(dday,dmonth,dyear,31,12,dyear-1));
  2433.      WHILE days <= ddays DO (* years *)
  2434.        dday := 31;
  2435.        dmonth := 12;
  2436.        DEC(dyear);
  2437.        days := days - ddays;
  2438.        ddays := SHORT(HeisDayDiff(dday,dmonth,dyear,31,12,dyear-1));
  2439.      END;
  2440.      ddays := SHORT(HeisDayDiff(dday,dmonth,dyear,HeisMonthDays(dmonth-1,dyear),dmonth-1,dyear));
  2441.      WHILE days <= ddays DO (* months *)
  2442.        dday := HeisMonthDays(dmonth-1,dyear);
  2443.        DEC(dmonth);
  2444.        days := days - ddays;
  2445.        ddays := SHORT(HeisDayDiff(dday,dmonth,dyear,HeisMonthDays(dmonth-1,dyear),dmonth-1,dyear));
  2446.      END;
  2447.      IF days < 0 THEN
  2448.        dday := SHORT(dday - ABS(days));
  2449.      END;
  2450.    END;
  2451.  END HeisDiffDate;
  2452.  
  2453.  (* ----------------------------------------------------------------------- *)
  2454.  
  2455.  PROCEDURE JYearToScaliger*(year : INTEGER) : INTEGER;
  2456.  
  2457. (*
  2458. ******* Date/JYearToScaliger ************************************************
  2459. *
  2460. *   NAME
  2461. *    JYearToScaliger -- Returns the year as Scaliger year. (V33)
  2462. *
  2463. *   SYNOPSIS
  2464. *    syear := JYearToScaliger(year);
  2465. *
  2466. *    PROCEDURE JYearToScaliger(year : INTEGER) : INTEGER;
  2467. *
  2468. *   FUNCTION
  2469. *    Returns the Scaliger year.
  2470. *
  2471. *   INPUTS
  2472. *    year     - Julian year
  2473. *
  2474. *   RESULT
  2475. *    syear - The Scaliger year
  2476. *
  2477. *   EXAMPLE
  2478. *    ...
  2479. *    syear := JYearToScaliger(1582);
  2480. *    ...
  2481. *
  2482. *   NOTES
  2483. *    It is better to use this function only from -7 to 1582!
  2484. *
  2485. *   BUGS
  2486. *    unknown.
  2487. *
  2488. *   SEE ALSO
  2489. *    GYearToScaliger(),HYearToScaliger()
  2490. *
  2491. *****************************************************************************
  2492. *
  2493. *
  2494. *)
  2495.  
  2496.  BEGIN
  2497.    IF (year < 0) AND (year > -4714) THEN
  2498.      RETURN(4714+year);
  2499.    ELSIF (year > 0) AND (year < 3268) THEN
  2500.      RETURN(4713+year);
  2501.    ELSE
  2502.      RETURN(0);
  2503.    END;
  2504.  END JYearToScaliger;
  2505.  
  2506.  
  2507.  PROCEDURE GYearToScaliger*(year : INTEGER) : INTEGER;
  2508.  
  2509. (*
  2510. ******* Date/GYearToScaliger ************************************************
  2511. *
  2512. *   NAME
  2513. *    GYearToScaliger -- Returns the year as Scaliger year. (V33)
  2514. *
  2515. *   SYNOPSIS
  2516. *    syear := GYearToScaliger(year);
  2517. *
  2518. *    PROCEDURE GYearToScaliger(year : INTEGER) : INTEGER;
  2519. *
  2520. *   FUNCTION
  2521. *    Returns the Scaliger year.
  2522. *
  2523. *   INPUTS
  2524. *    year     - Gregorian year
  2525. *
  2526. *   RESULT
  2527. *    syear - The Scaliger year
  2528. *
  2529. *   EXAMPLE
  2530. *    ...
  2531. *    syear := GYearToScaliger(1994);
  2532. *    ...
  2533. *
  2534. *   NOTES
  2535. *    It is better to use this function only from -7 to 3200!
  2536. *
  2537. *   BUGS
  2538. *    unknown.
  2539. *
  2540. *   SEE ALSO
  2541. *    JYearToScaliger(),HYearToScaliger()
  2542. *
  2543. *****************************************************************************
  2544. *
  2545. *
  2546. *)
  2547.  
  2548.  BEGIN
  2549.    (* if other calcs are better use here! *)
  2550.    RETURN(JYearToScaliger(year));
  2551.  END GYearToScaliger;
  2552.  
  2553.  
  2554.  PROCEDURE HYearToScaliger*(year : INTEGER) : INTEGER;
  2555.  
  2556. (*
  2557. ******* Date/HYearToScaliger ************************************************
  2558. *
  2559. *   NAME
  2560. *    HYearToScaliger -- Returns the year as Scaliger year. (V33)
  2561. *
  2562. *   SYNOPSIS
  2563. *    syear := HYearToScaliger(year);
  2564. *
  2565. *    PROCEDURE HYearToScaliger(year : INTEGER) : INTEGER;
  2566. *
  2567. *   FUNCTION
  2568. *    Returns the Scaliger year.
  2569. *
  2570. *   INPUTS
  2571. *    year     - Heis year
  2572. *
  2573. *   RESULT
  2574. *    syear - The Scaliger year
  2575. *
  2576. *   EXAMPLE
  2577. *    ...
  2578. *    syear := HYearToScaliger(1994);
  2579. *    ...
  2580. *
  2581. *   NOTES
  2582. *    It is better to use this function only from -7 to 8000!
  2583. *
  2584. *   BUGS
  2585. *    The Scaliger period is defined to 3268!!!.
  2586. *
  2587. *   SEE ALSO
  2588. *    JYearToScaliger(),GYearToScaliger()
  2589. *
  2590. *****************************************************************************
  2591. *
  2592. *
  2593. *)
  2594.  
  2595.  BEGIN
  2596.    (* for compatiblities if GYearToScaliger will be changed *)
  2597.    RETURN(GYearToScaliger(year));
  2598.  END HYearToScaliger;
  2599.  
  2600.  (* ----------------------------------------------------------------------- *)
  2601.  
  2602.  PROCEDURE ScaligerYearToJ*(syear : INTEGER) : INTEGER;
  2603.  
  2604. (*
  2605. ******* Date/ScaligerYearToJ ************************************************
  2606. *
  2607. *   NAME
  2608. *    ScaligerYearToJ -- Returns the Scaliger year as Julian year. (V33)
  2609. *
  2610. *   SYNOPSIS
  2611. *    year := ScaligerYearToJ(syear);
  2612. *
  2613. *    PROCEDURE ScaligerYearToJ(syear : INTEGER) : INTEGER;
  2614. *
  2615. *   FUNCTION
  2616. *    Returns the Julian year of a Scaliger year.
  2617. *
  2618. *   INPUTS
  2619. *    syear     - Scaliger year
  2620. *
  2621. *   RESULT
  2622. *    year - The Julian year
  2623. *
  2624. *   EXAMPLE
  2625. *    ...
  2626. *    year := ScaligerYearToJ(4800);
  2627. *    ...
  2628. *
  2629. *   NOTES
  2630. *    It is better to use this function only from 4707 to 6295!
  2631. *
  2632. *   BUGS
  2633. *    unknown.
  2634. *
  2635. *   SEE ALSO
  2636. *    ScaligerYearToG(),ScaligerYearToH()
  2637. *
  2638. *****************************************************************************
  2639. *
  2640. *
  2641. *)
  2642.  
  2643.  BEGIN
  2644.    IF (syear < 4714) THEN
  2645.      RETURN(4714+syear);
  2646.    ELSE
  2647.      RETURN(syear-4713);
  2648.    END;
  2649.  END ScaligerYearToJ;
  2650.  
  2651.  
  2652.  PROCEDURE ScaligerYearToG*(syear : INTEGER) : INTEGER;
  2653.  
  2654. (*
  2655. ******* Date/ScaligerYearToG ************************************************
  2656. *
  2657. *   NAME
  2658. *    ScaligerYearToG -- Returns the Scaliger year as Gregorian year. (V33)
  2659. *
  2660. *   SYNOPSIS
  2661. *    year := ScaligerYearToG(syear);
  2662. *
  2663. *    PROCEDURE ScaligerYearToG(syear : INTEGER) : INTEGER;
  2664. *
  2665. *   FUNCTION
  2666. *    Returns the Gregorian year of a Scaliger year.
  2667. *
  2668. *   INPUTS
  2669. *    syear     - Scaliger year
  2670. *
  2671. *   RESULT
  2672. *    year - The Gregorian year
  2673. *
  2674. *   EXAMPLE
  2675. *    ...
  2676. *    year := ScaligerYearToG(6400);
  2677. *    ...
  2678. *
  2679. *   NOTES
  2680. *    It is better to use this function only from 4707 to 7981!
  2681. *
  2682. *   BUGS
  2683. *    unknown.
  2684. *
  2685. *   SEE ALSO
  2686. *    ScaligerYearToJ(),ScaligerYearToH()
  2687. *
  2688. *****************************************************************************
  2689. *
  2690. *
  2691. *)
  2692.  
  2693.  BEGIN
  2694.    RETURN(ScaligerYearToJ(syear));
  2695.  END ScaligerYearToG;
  2696.  
  2697.  
  2698.  PROCEDURE ScaligerYearToH*(syear : INTEGER) : INTEGER;
  2699.  
  2700. (*
  2701. ******* Date/ScaligerYearToH ************************************************
  2702. *
  2703. *   NAME
  2704. *    ScaligerYearToH -- Returns the Scaliger year as Heis year. (V33)
  2705. *
  2706. *   SYNOPSIS
  2707. *    year := ScaligerYearToH(syear);
  2708. *
  2709. *    PROCEDURE ScaligerYearToH(syear : INTEGER) : INTEGER;
  2710. *
  2711. *   FUNCTION
  2712. *    Returns the Heis year of a Scaliger year.
  2713. *
  2714. *   INPUTS
  2715. *    syear     - Scaliger year
  2716. *
  2717. *   RESULT
  2718. *    year - The Heis year
  2719. *
  2720. *   EXAMPLE
  2721. *    ...
  2722. *    year := ScaligerYearToH(7000);
  2723. *    ...
  2724. *
  2725. *   NOTES
  2726. *    It is better to use this function only from 4707 to 7981!
  2727. *
  2728. *   BUGS
  2729. *    unknown.
  2730. *
  2731. *   SEE ALSO
  2732. *    ScaligerYearToJ(),ScaligerYearToG()
  2733. *
  2734. *****************************************************************************
  2735. *
  2736. *
  2737. *)
  2738.  
  2739.  VAR
  2740.     year    : INTEGER;
  2741.  
  2742.  BEGIN (* for compatibilitie if ScaligerYearToG is changed! *)
  2743.    RETURN(ScaligerYearToG(syear));
  2744.  END ScaligerYearToH;
  2745.  
  2746.  (* ----------------------------------------------------------------------- *)
  2747.  
  2748.  PROCEDURE JSYearToJD*(syear : INTEGER) : LONGINT;
  2749.  
  2750. (*
  2751. ******* Date/JSYearToJD *****************************************************
  2752. *
  2753. *   NAME
  2754. *    JSYearToJD -- Calcs the JD from a Scaliger year. (V33)
  2755. *
  2756. *   SYNOPSIS
  2757. *    jd := JSYearToJD(syear);
  2758. *
  2759. *    PROCEDURE JSYearToJD(syear : INTEGER) : LONGINT;
  2760. *
  2761. *   FUNCTION
  2762. *    Returns the Julianday of a Scaliger year.
  2763. *
  2764. *   INPUTS
  2765. *    syear     - Scaliger year
  2766. *
  2767. *   RESULT
  2768. *    jd - The Julianday
  2769. *
  2770. *   EXAMPLE
  2771. *    ...
  2772. *    jd := JSYearToJD(4800);
  2773. *    ...
  2774. *
  2775. *   NOTES
  2776. *    It is better to use this function only from 4707 to 6295!
  2777. *
  2778. *   BUGS
  2779. *    unknown.
  2780. *
  2781. *   SEE ALSO
  2782. *    GSYearToJD(),HSYearToJD()
  2783. *
  2784. *****************************************************************************
  2785. *
  2786. *
  2787. *)
  2788.  
  2789.  BEGIN
  2790.    RETURN((LONG(syear)-1)*365+(LONG(syear)+2) DIV 4);
  2791.  END JSYearToJD;
  2792.  
  2793.  
  2794.  PROCEDURE GSYearToJD*(syear : INTEGER) : LONGINT;
  2795.  
  2796. (*
  2797. ******* Date/GSYearToJD *****************************************************
  2798. *
  2799. *   NAME
  2800. *    GSYearToJD -- Calcs the JD from a Scaliger year. (V33)
  2801. *
  2802. *   SYNOPSIS
  2803. *    jd := GSYearToJD(syear);
  2804. *
  2805. *    PROCEDURE GSYearToJD(syear : INTEGER) : LONGINT;
  2806. *
  2807. *   FUNCTION
  2808. *    Returns the Julianday of a Scaliger year.
  2809. *
  2810. *   INPUTS
  2811. *    syear     - Scaliger year
  2812. *
  2813. *   RESULT
  2814. *    jd - The Julianday
  2815. *
  2816. *   EXAMPLE
  2817. *    ...
  2818. *    jd := GSYearToJD(4800);
  2819. *    ...
  2820. *
  2821. *   NOTES
  2822. *    It is better to use this function only from 4707 to 7981!
  2823. *
  2824. *   BUGS
  2825. *    unknown.
  2826. *
  2827. *   SEE ALSO
  2828. *    JSYearToJD(),HSYearToJD()
  2829. *
  2830. *****************************************************************************
  2831. *
  2832. *
  2833. *)
  2834.  
  2835.  BEGIN
  2836.    IF syear < 6296 THEN (* 1583 *)
  2837.      RETURN(JSYearToJD(syear));
  2838.    ELSE
  2839.      RETURN(JSYearToJD(6296)-10+GregorianDayDiff(1,1,1583,1,1,ScaligerYearToG(syear)));
  2840.    END;
  2841.  END GSYearToJD;
  2842.  
  2843.  
  2844.  PROCEDURE HSYearToJD*(syear : INTEGER) : LONGINT;
  2845.  
  2846. (*
  2847. ******* Date/HSYearToJD *****************************************************
  2848. *
  2849. *   NAME
  2850. *    HSYearToJD -- Calcs the JD from a Scaliger year. (V33)
  2851. *
  2852. *   SYNOPSIS
  2853. *    jd := HSYearToJD(syear);
  2854. *
  2855. *    PROCEDURE HSYearToJD(syear : INTEGER) : LONGINT;
  2856. *
  2857. *   FUNCTION
  2858. *    Returns the Julianday of a Scaliger year.
  2859. *
  2860. *   INPUTS
  2861. *    syear     - Scaliger year
  2862. *
  2863. *   RESULT
  2864. *    jd - The Julianday
  2865. *
  2866. *   EXAMPLE
  2867. *    ...
  2868. *    jd := HSYearToJD(6700);
  2869. *    ...
  2870. *
  2871. *   NOTES
  2872. *    It is better to use this function only from 4707 to 7981!
  2873. *    In this version only GSYearToJD() is called, because the
  2874. *    Scaliger period is only valid to 3268
  2875. *
  2876. *   BUGS
  2877. *    unknown.
  2878. *
  2879. *   SEE ALSO
  2880. *    JSYearToJD(),GSYearToJD()
  2881. *
  2882. *****************************************************************************
  2883. *
  2884. *
  2885. *)
  2886.  
  2887.  BEGIN
  2888.    RETURN(GSYearToJD(syear));
  2889.  END HSYearToJD;
  2890.  
  2891.  (* ----------------------------------------------------------------------- *)
  2892.  
  2893.  PROCEDURE JDtoMJD*(jd : LONGINT) : LONGINT;
  2894.  
  2895. (*
  2896. ******* Date/JDtoMJD ********************************************************
  2897. *
  2898. *   NAME
  2899. *    JDtoMJD -- Switches from JD to MJD. (V33)
  2900. *
  2901. *   SYNOPSIS
  2902. *    mjd := JDtoMJD(jd);
  2903. *
  2904. *    PROCEDURE JDtoMJD(jd : LONGINT) : LONGINT;
  2905. *
  2906. *   FUNCTION
  2907. *    Returns the Modified Julianday of a Julianday.
  2908. *
  2909. *   INPUTS
  2910. *    jd - Julianday
  2911. *
  2912. *   RESULT
  2913. *    mjd - The Modified Julianday
  2914. *
  2915. *   EXAMPLE
  2916. *    ...
  2917. *    mjd := JDtoMJD(2449354);
  2918. *    ...
  2919. *
  2920. *   NOTES
  2921. *    none
  2922. *
  2923. *   BUGS
  2924. *    Only use this function for jd > 2400001, because mjd is only
  2925. *    defined for this, otherwise system will crash!
  2926. *
  2927. *   SEE ALSO
  2928. *    MJDtoJD()
  2929. *
  2930. *****************************************************************************
  2931. *
  2932. *
  2933. *)
  2934.  
  2935.  BEGIN
  2936.    RETURN(jd-2400001);
  2937.  END JDtoMJD;
  2938.  
  2939.  
  2940.  PROCEDURE MJDtoJD*(mjd : LONGINT) : LONGINT;
  2941.  
  2942. (*
  2943. ******* Date/MJDtoJD ********************************************************
  2944. *
  2945. *   NAME
  2946. *    MJDtoJD -- Switches from MJD to JD. (V33)
  2947. *
  2948. *   SYNOPSIS
  2949. *    jd := MJDtoJD(mjd);
  2950. *
  2951. *    PROCEDURE MJDtoJD(mjd : LONGINT) : LONGINT;
  2952. *
  2953. *   FUNCTION
  2954. *    Returns the Julianday of a Modified Julianday.
  2955. *
  2956. *   INPUTS
  2957. *    mjd - Modified Julianday
  2958. *
  2959. *   RESULT
  2960. *    jd - The Julianday
  2961. *
  2962. *   EXAMPLE
  2963. *    ...
  2964. *    jd := JDtoMJD(49353);
  2965. *    ...
  2966. *
  2967. *   NOTES
  2968. *    none
  2969. *
  2970. *   BUGS
  2971. *    unknown.
  2972. *
  2973. *   SEE ALSO
  2974. *    MJDtoJD()
  2975. *
  2976. *****************************************************************************
  2977. *
  2978. *
  2979. *)
  2980.  
  2981.  BEGIN
  2982.    RETURN(mjd+2400001);
  2983.  END MJDtoJD;
  2984.  
  2985.  (* ----------------------------------------------------------------------- *)
  2986.  
  2987.  PROCEDURE JulianToJD*(day,month : SHORTINT; year : INTEGER) : LONGINT;
  2988.  
  2989. (*
  2990. ******* Date/JulianToJD *****************************************************
  2991. *
  2992. *   NAME
  2993. *    JulianToJD -- Returns the JD for a date. (V33)
  2994. *
  2995. *   SYNOPSIS
  2996. *    jd := JulianToJD(day,month,year);
  2997. *
  2998. *    PROCEDURE JulianToJD(day,month : SHORTINT;
  2999. *        year : INTEGER) : LONGINT;
  3000. *
  3001. *   FUNCTION
  3002. *    Returns the JD for a Julian date.
  3003. *
  3004. *   INPUTS
  3005. *    day      - day of the date to convert
  3006. *    month    - month of the date to convert
  3007. *    year     - year of the date to convert
  3008. *
  3009. *   RESULT
  3010. *    jd - This is the JD
  3011. *
  3012. *   EXAMPLE
  3013. *    ...
  3014. *    jd := JulianToJD(23,1,1994);
  3015. *    ...
  3016. *
  3017. *   NOTES
  3018. *    It is better to use this function only from -7 to 1582!
  3019. *
  3020. *   BUGS
  3021. *    unknown.
  3022. *
  3023. *   SEE ALSO
  3024. *    GregorianToJD(),HeisToJD(),JSYearToJD(),JYearToScaliger(),
  3025. *    JulianDayDiff()
  3026. *
  3027. *****************************************************************************
  3028. *
  3029. *
  3030. *)
  3031.  
  3032.  BEGIN
  3033.    RETURN(JSYearToJD(JYearToScaliger(year))+JulianDayDiff(1,1,year,day,month,year));
  3034.  END JulianToJD;
  3035.  
  3036.  
  3037.  PROCEDURE GregorianToJD*(day,month : SHORTINT; year : INTEGER) : LONGINT;
  3038.  
  3039. (*
  3040. ******* Date/GregorianToJD **************************************************
  3041. *
  3042. *   NAME
  3043. *    GregorianToJD -- Returns the JD for a date. (V33)
  3044. *
  3045. *   SYNOPSIS
  3046. *    jd := GregorianToJD(day,month,year);
  3047. *
  3048. *    PROCEDURE GregorianToJD(day,month : SHORTINT;
  3049. *        year : INTEGER) : LONGINT;
  3050. *
  3051. *   FUNCTION
  3052. *    Returns the JD for a Gregorian date.
  3053. *
  3054. *   INPUTS
  3055. *    day      - day of the date to convert
  3056. *    month    - month of the date to convert
  3057. *    year     - year of the date to convert
  3058. *
  3059. *   RESULT
  3060. *    jd - This is the JD
  3061. *
  3062. *   EXAMPLE
  3063. *    ...
  3064. *    jd := GregorianToJD(23,1,1994);
  3065. *    ...
  3066. *
  3067. *   NOTES
  3068. *    It is better to use this function only from -7 to 3200!
  3069. *
  3070. *   BUGS
  3071. *    unknown.
  3072. *
  3073. *   SEE ALSO
  3074. *    JulianToJD(),HeisToJD(),GSYearToJD(),GYearToScaliger(),
  3075. *    GregorianDayDiff()
  3076. *
  3077. *****************************************************************************
  3078. *
  3079. *
  3080. *)
  3081.  
  3082.  BEGIN
  3083.    RETURN(GSYearToJD(GYearToScaliger(year))+GregorianDayDiff(1,1,year,day,month,year));
  3084.  END GregorianToJD;
  3085.  
  3086.  
  3087.  PROCEDURE HeisToJD*(day,month : SHORTINT; year : INTEGER) : LONGINT;
  3088.  
  3089. (*
  3090. ******* Date/HeisToJD *******************************************************
  3091. *
  3092. *   NAME
  3093. *    HeisToJD -- Returns the JD for a date. (V33)
  3094. *
  3095. *   SYNOPSIS
  3096. *    jd := HeisToJD(day,month,year);
  3097. *
  3098. *    PROCEDURE HeisToJD(day,month : SHORTINT;
  3099. *        year : INTEGER) : LONGINT;
  3100. *
  3101. *   FUNCTION
  3102. *    Returns the JD for a Heis date.
  3103. *
  3104. *   INPUTS
  3105. *    day      - day of the date to convert
  3106. *    month    - month of the date to convert
  3107. *    year     - year of the date to convert
  3108. *
  3109. *   RESULT
  3110. *    jd - This is the JD
  3111. *
  3112. *   EXAMPLE
  3113. *    ...
  3114. *    jd := HeisToJD(23,1,1994);
  3115. *    ...
  3116. *
  3117. *   NOTES
  3118. *    It is better to use this function only from -7 to 3268!
  3119. *
  3120. *   BUGS
  3121. *    unknown.
  3122. *
  3123. *   SEE ALSO
  3124. *    JulianToJD(),GregorianToJD(),HSYearToJD(),HYearToScaliger(),
  3125. *    HeisDayDiff()
  3126. *
  3127. *****************************************************************************
  3128. *
  3129. *
  3130. *)
  3131.  
  3132.  BEGIN
  3133.    RETURN(HSYearToJD(HYearToScaliger(year))+HeisDayDiff(1,1,year,day,month,year));
  3134.  END HeisToJD;
  3135.  
  3136.  (* ----------------------------------------------------------------------- *)
  3137.  
  3138.  PROCEDURE TimeToJD*(hour,min,sec : SHORTINT) : REAL;
  3139.  
  3140. (*
  3141. ******* Date/TimeToJD *******************************************************
  3142. *
  3143. *   NAME
  3144. *    TimeToJD -- Returns the JD for a time. (V33)
  3145. *
  3146. *   SYNOPSIS
  3147. *    jd := TimeToJD(hour,min,sec);
  3148. *
  3149. *    PROCEDURE TimeToJD(hour,min,sec : SHORTINT) : REAL;
  3150. *
  3151. *   FUNCTION
  3152. *    Returns the JD for a specified time.
  3153. *
  3154. *   INPUTS
  3155. *    hour - hour of the time to convert
  3156. *    min  - minute of the time to convert
  3157. *    sec  - sec. of the time to convert
  3158. *
  3159. *   RESULT
  3160. *    jd - This is the JD time
  3161. *
  3162. *   EXAMPLE
  3163. *    ...
  3164. *    jd := TimeToJD(16,33,0);
  3165. *    ...
  3166. *
  3167. *   NOTES
  3168. *    none
  3169. *
  3170. *   BUGS
  3171. *    There is no check, if the specified time is a valid time!
  3172. *
  3173. *   SEE ALSO
  3174. *    JDToTime()
  3175. *
  3176. *****************************************************************************
  3177. *
  3178. *
  3179. *)
  3180.  
  3181.  BEGIN
  3182.    RETURN(LONG(LONG(hour*3600+min*60+sec)) / 86400.0);
  3183.  END TimeToJD;
  3184.  
  3185.  
  3186.  PROCEDURE JDToTime*(jd : REAL; VAR rhour,rmin,rsec : SHORTINT);
  3187.  
  3188. (*
  3189. ******* Date/JDToTime *******************************************************
  3190. *
  3191. *   NAME
  3192. *    JDToTime -- Returns the real time for a JD time. (V33)
  3193. *
  3194. *   SYNOPSIS
  3195. *    JDToTime(jd,rhour,rmin,rsec);
  3196. *
  3197. *    PROCEDURE JDToTime(jd : REAL; VAR rhour,rmin,rsec : SHORTINT);
  3198. *
  3199. *   FUNCTION
  3200. *    Returns the real time for a JD time.
  3201. *
  3202. *   INPUTS
  3203. *    jd - JD time
  3204. *
  3205. *   RESULT
  3206. *    rhour - 24 hour real time
  3207. *    rmin  - real minutes
  3208. *    rsec  - real seconds
  3209. *
  3210. *   EXAMPLE
  3211. *    ...
  3212. *    JDToTime(0.76543,rhour,rmin,rsec);
  3213. *    ...
  3214. *
  3215. *   NOTES
  3216. *    none.
  3217. *
  3218. *   BUGS
  3219. *    If jd is > 0 (including days) there will be occur arithmetic bugs!
  3220. *
  3221. *   SEE ALSO
  3222. *    TimeToJD()
  3223. *
  3224. *****************************************************************************
  3225. *
  3226. *
  3227. *)
  3228.  
  3229.  VAR
  3230.     sec    : LONGINT;
  3231.  
  3232.  BEGIN
  3233.      IF jd > 0.0 THEN
  3234.        jd := jd - ENTIER(jd);
  3235.      END;
  3236.      sec := ENTIER(jd * 86400.0);
  3237.      rhour := SHORT(SHORT(sec DIV 3600));
  3238.      sec := sec - (sec DIV 3600) * 3600;
  3239.      rmin := SHORT(SHORT(sec DIV 60));
  3240.      sec := sec - (sec DIV 60) * 60;
  3241.      rsec := SHORT(SHORT(sec));
  3242.  END JDToTime;
  3243.  
  3244.  (* ----internal----------------------------------------------------------- *)
  3245.  
  3246.  PROCEDURE GregorianSZ(year : INTEGER) : SHORTINT;
  3247.  
  3248. (*
  3249. *****i* Date/GregorianSZ ****************************************************
  3250. *
  3251. *   NAME
  3252. *    GregorianSZ -- Returns the 'Sonnenzirkel' (V33)
  3253. *
  3254. *   SYNOPSIS
  3255. *    sz := GregorianSZ(year);
  3256. *
  3257. *    PROCEDURE GregorianSZ(year : INTEGER) : SHORTINT;
  3258. *
  3259. *   FUNCTION
  3260. *    Returns the 'Sonnenzirkel' of a year.
  3261. *
  3262. *   INPUTS
  3263. *    year     - For this year the 'Sonnenzirkel' is calculatet.
  3264. *
  3265. *   RESULT
  3266. *    sz - The 'Sonnenzirkel' for the specified year.
  3267. *
  3268. *   EXAMPLE
  3269. *    ...
  3270. *    sz := GregorianSZ(1994);
  3271. *    ...
  3272. *
  3273. *   NOTES
  3274. *    Use this only for 1582 to 4100!
  3275. *
  3276. *   BUGS
  3277. *    unknown.
  3278. *
  3279. *   SEE ALSO
  3280. *    GYearToScaliger()
  3281. *
  3282. *****************************************************************************
  3283. *
  3284. *
  3285. *)
  3286.  
  3287.  VAR
  3288.     sz    : SHORTINT;
  3289.  
  3290.  BEGIN
  3291.    sz := SHORT(GYearToScaliger(year) MOD 28);
  3292.    IF sz = 0 THEN
  3293.      sz := 28;
  3294.    END;
  3295.    RETURN(sz);
  3296.  END GregorianSZ;
  3297.  
  3298.  
  3299.  PROCEDURE GregorianGZ(year : INTEGER) : SHORTINT;
  3300.  
  3301. (*
  3302. *****i* Date/GregorianGZ ****************************************************
  3303. *
  3304. *   NAME
  3305. *    GregorianGZ -- Returns the 'Goldene Zahl' (golden number) (V33)
  3306. *
  3307. *   SYNOPSIS
  3308. *    gz := GregorianGZ(year);
  3309. *
  3310. *    PROCEDURE GregorianGZ(year : INTEGER) : SHORTINT;
  3311. *
  3312. *   FUNCTION
  3313. *    Returns the 'Goldene Zahl' of a year.
  3314. *
  3315. *   INPUTS
  3316. *    year     - For this year the 'Goldene Zahl' is calculatet.
  3317. *
  3318. *   RESULT
  3319. *    gz - The 'Goldene Zahl' for the specified year.
  3320. *
  3321. *   EXAMPLE
  3322. *    ...
  3323. *    gz := GregorianGZ(1994);
  3324. *    ...
  3325. *
  3326. *   NOTES
  3327. *    Use this only for 1582 to 4100!
  3328. *
  3329. *   BUGS
  3330. *    unknown.
  3331. *
  3332. *   SEE ALSO
  3333. *    GYearToScaliger()
  3334. *
  3335. *****************************************************************************
  3336. *
  3337. *
  3338. *)
  3339.  
  3340.  VAR
  3341.     syear    : INTEGER;
  3342.  
  3343.  BEGIN
  3344.    syear := GYearToScaliger(year);
  3345.    syear := syear MOD 19;
  3346.    IF syear = 0 THEN
  3347.      syear := 19;
  3348.    END;
  3349.    RETURN(SHORT(syear));
  3350.  END GregorianGZ;
  3351.  
  3352.  
  3353.  PROCEDURE GEP(year : INTEGER) : SHORTINT;
  3354.  
  3355. (*
  3356. *****i* Date/GEP ************************************************************
  3357. *
  3358. *   NAME
  3359. *    GEP -- Internal function to help calculating the 'EP' (V33)
  3360. *
  3361. *   SYNOPSIS
  3362. *    hep := GEP(year);
  3363. *
  3364. *    PROCEDURE GEP(year : INTEGER) : SHORTINT;
  3365. *
  3366. *   FUNCTION
  3367. *    Internal function to help calculating the 'EP'
  3368. *
  3369. *   INPUTS
  3370. *    year - This is the year for which the help EP is to be
  3371. *        calculatetd
  3372. *
  3373. *   RESULT
  3374. *    hep - The help value for the EP calculation.
  3375. *
  3376. *   EXAMPLE
  3377. *    ...
  3378. *    hep := GEP(1994);
  3379. *    ...
  3380. *
  3381. *   NOTES
  3382. *    Use this only for 1582 to 4100!
  3383. *
  3384. *   BUGS
  3385. *    unknown.
  3386. *
  3387. *   SEE ALSO
  3388. *
  3389. *
  3390. *****************************************************************************
  3391. *
  3392. *
  3393. *)
  3394.  
  3395.    VAR
  3396.     century,decade    : SHORTINT;
  3397.     ep        : INTEGER;
  3398.  
  3399.    BEGIN
  3400.      ep := 1; (* 1582 *)
  3401.      century := SHORT(year DIV 100);
  3402.      decade := SHORT(year - century * 100);
  3403.      IF year < 1701 THEN
  3404.        RETURN(1);
  3405.      ELSIF year < 1800 THEN
  3406.        RETURN(0);
  3407.      ELSE
  3408.        ep := ep - (((century) MOD 4) + (((century-16) DIV 4) * 3));
  3409.        IF (decade = 0) AND ((century MOD 4) > 0) THEN
  3410.          INC(ep);
  3411.        END;
  3412.        ep := ep + ((century-18) DIV 3);
  3413.        IF (((century-18) MOD 3) > 0) OR (decade > 0) THEN
  3414.          INC(ep);
  3415.        END;
  3416.        IF ep > 29 THEN
  3417.          ep := ep MOD 30;
  3418.        END;
  3419.        IF ep < 0 THEN
  3420.          ep := ep + 30;
  3421.        END;
  3422.        RETURN(SHORT(ep));
  3423.      END;
  3424.    END GEP;
  3425.  
  3426.  
  3427.  PROCEDURE GregorianEP(year : INTEGER) : SHORTINT;
  3428.  
  3429. (*
  3430. *****i* Date/GregorianEP ****************************************************
  3431. *
  3432. *   NAME
  3433. *    GregorianEP -- Returns the 'Epakte' (V33)
  3434. *
  3435. *   SYNOPSIS
  3436. *    ep := GregorianEP(year);
  3437. *
  3438. *    PROCEDURE GregorianEP(year : INTEGER) : SHORTINT;
  3439. *
  3440. *   FUNCTION
  3441. *    Returns the 'Epakte' of a year.
  3442. *
  3443. *   INPUTS
  3444. *    year     - For this year the 'Epakte' is calculatet.
  3445. *
  3446. *   RESULT
  3447. *    ep - The 'Epakte' for the specified year.
  3448. *
  3449. *   EXAMPLE
  3450. *    ...
  3451. *    ep := GregorianEP(1994);
  3452. *    ...
  3453. *
  3454. *   NOTES
  3455. *    Use this only for 1582 to 4100!
  3456. *
  3457. *   BUGS
  3458. *    unknown.
  3459. *
  3460. *   SEE ALSO
  3461. *    GregorianGZ(),GEP()
  3462. *
  3463. *****************************************************************************
  3464. *
  3465. *
  3466. *)
  3467.  
  3468.  VAR
  3469.     ep    : SHORTINT;
  3470.  
  3471.  BEGIN
  3472.    IF year >= 1582 THEN
  3473.      ep := ((GregorianGZ(year)-1)*11 + GEP(year)) MOD 30;
  3474.      IF ep = 0 THEN
  3475.        ep := 30;
  3476.      END;
  3477.      RETURN(ep);
  3478.    ELSE
  3479.      RETURN(31);
  3480.    END;
  3481.  END GregorianEP;
  3482.  
  3483.  
  3484.  PROCEDURE GregorianJHStartSB(century : SHORTINT) : SHORTINT;
  3485.  
  3486. (*
  3487. *****i* Date/GregorianJHStartSB *********************************************
  3488. *
  3489. *   NAME
  3490. *    GregorianJHStartSB -- Returns the 'Sonntagsbuchstabe' (V33)
  3491. *
  3492. *   SYNOPSIS
  3493. *    csb := GregorianJHStartSB(century);
  3494. *
  3495. *    PROCEDURE GregorianJHStartSB(century : SHORTINT) : SHORTINT;
  3496. *
  3497. *   FUNCTION
  3498. *    Returns start 'SB' for a century.
  3499. *
  3500. *   INPUTS
  3501. *    century - For this century the start 'SB' is calculatet.
  3502. *
  3503. *   RESULT
  3504. *    csb - The start 'SB' for the specified century.
  3505. *
  3506. *   EXAMPLE
  3507. *    ...
  3508. *    csb := GregorianJHStartSB(19);
  3509. *    ...
  3510. *
  3511. *   NOTES
  3512. *    Use this only for 15 to 31!
  3513. *
  3514. *   BUGS
  3515. *    unknown.
  3516. *
  3517. *   SEE ALSO
  3518. *
  3519. *
  3520. *****************************************************************************
  3521. *
  3522. *
  3523. *)
  3524.  
  3525.  VAR
  3526.     sb    : SHORTINT;
  3527.  
  3528.  BEGIN
  3529.   IF century = 15 THEN
  3530.     RETURN(4);
  3531.   ELSE
  3532.     sb := GregorianJHStartSB(century-1);
  3533.     IF (century MOD 4) > 0 THEN
  3534.       INC(sb);
  3535.     END;
  3536.     sb := sb MOD 7;
  3537.     IF sb = 0 THEN
  3538.       sb := 7;
  3539.     END;
  3540.     RETURN(sb);
  3541.   END;
  3542.  END GregorianJHStartSB;
  3543.  
  3544.  
  3545.  PROCEDURE GregorianJHSB(year : INTEGER) : SHORTINT;
  3546.  
  3547. (*
  3548. *****i* Date/GregorianSB ****************************************************
  3549. *
  3550. *   NAME
  3551. *    GregorianJHSB -- Returns the 'Sonntagsbuchstabe' (V33)
  3552. *
  3553. *   SYNOPSIS
  3554. *    sb := GregorianJHSB(year);
  3555. *
  3556. *    PROCEDURE GregorianJHSB(year : INTEGER) : SHORTINT;
  3557. *
  3558. *   FUNCTION
  3559. *    Returns the start 'SB' for a century year.
  3560. *
  3561. *   INPUTS
  3562. *    year - For this century year the start 'SB' is calculatet.
  3563. *
  3564. *   RESULT
  3565. *    sb - The start 'SB' for the specified year.
  3566. *
  3567. *   EXAMPLE
  3568. *    ...
  3569. *    sb := GregorianJHSB(1994);
  3570. *    ...
  3571. *
  3572. *   NOTES
  3573. *    Use this only for 1583 to 3199!
  3574. *
  3575. *   BUGS
  3576. *    unknown.
  3577. *
  3578. *   SEE ALSO
  3579. *    GregorianLeapYear(),GregorianJHStartSB()
  3580. *
  3581. *****************************************************************************
  3582. *
  3583. *
  3584. *)
  3585.  
  3586.  BEGIN
  3587.   IF ((year MOD 100) = 0) AND (~GregorianLeapYear(year)) THEN
  3588.     RETURN(SHORT(((year DIV 100) MOD 4) *2 +1));
  3589.   ELSE
  3590.     RETURN(GregorianJHStartSB(SHORT(year DIV 100)));
  3591.   END;
  3592.  END GregorianJHSB;
  3593.  
  3594.  
  3595.  PROCEDURE GregorianSB(year : INTEGER) : SHORTINT;
  3596.  
  3597. (*
  3598. *****i* Date/GregorianSB ****************************************************
  3599. *
  3600. *   NAME
  3601. *    GregorianSB -- Returns the 'Sonntagsbuchstabe' (V33)
  3602. *
  3603. *   SYNOPSIS
  3604. *    sb := GregorianSB(year);
  3605. *
  3606. *    PROCEDURE GregorianSB(year : INTEGER) : SHORTINT;
  3607. *
  3608. *   FUNCTION
  3609. *    Returns the 'SB' for a year.
  3610. *
  3611. *   INPUTS
  3612. *    year - For this year the 'SB' is calculatet.
  3613. *
  3614. *   RESULT
  3615. *    sb - The 'SB' for the specified year.
  3616. *        This means the day the first Sunday lies on :)
  3617. *
  3618. *   EXAMPLE
  3619. *    ...
  3620. *    sb := GregorianSB(1994);
  3621. *    ...
  3622. *
  3623. *   NOTES
  3624. *    Use this only for 1583 to 3199!
  3625. *
  3626. *   BUGS
  3627. *    unknown.
  3628. *
  3629. *   SEE ALSO
  3630. *    GregorianLeapYear(),GregorianSZ(),GregorianJHStartSB()
  3631. *
  3632. *****************************************************************************
  3633. *
  3634. *
  3635. *)
  3636.  
  3637.  VAR
  3638.     sz,csb,i    : SHORTINT;
  3639.  
  3640.  BEGIN
  3641.    IF ((year MOD 100) = 0) AND (~GregorianLeapYear(year)) THEN
  3642.      RETURN(SHORT(((year DIV 100) MOD 4) *2 +1));
  3643.    ELSE
  3644.      sz := GregorianSZ(year);
  3645.      csb := GregorianJHStartSB(SHORT(year DIV 100));
  3646.      IF sz = 28 THEN
  3647.        RETURN(csb);
  3648.      ELSE
  3649.        FOR i := 27 TO sz BY -1 DO
  3650.          INC(csb);
  3651.          IF csb = 8 THEN
  3652.            csb := 1;
  3653.          END;
  3654.          IF ((i-1) MOD 4) = 0 THEN
  3655.            INC(csb);
  3656.            IF csb = 8 THEN
  3657.              csb := 1;
  3658.            END;
  3659.          END;
  3660.        END;
  3661.        RETURN(csb);
  3662.      END;
  3663.    END;
  3664.  END GregorianSB;
  3665.  
  3666.  (* ----------------------------------------------------------------------- *)
  3667.  
  3668.  PROCEDURE GregorianMoonAge*(day,month : SHORTINT; year : INTEGER) : SHORTINT;
  3669.  
  3670. (*
  3671. ******* Date/GregorianMoonAge ***********************************************
  3672. *
  3673. *   NAME
  3674. *    GregorianMoonAge -- Returns the age of the moon (V33)
  3675. *
  3676. *   SYNOPSIS
  3677. *    ep := GregorianMoonAge(day,month,year);
  3678. *
  3679. *    PROCEDURE GregorianMoonAge(day,month : SHORTINT;
  3680. *        year : INTEGER) : SHORTINT;
  3681. *
  3682. *   FUNCTION
  3683. *    Returns the age of the moon on a specified date.
  3684. *
  3685. *   INPUTS
  3686. *    day   - For this day the age is calculated.
  3687. *    month - For this month the age is calculated.
  3688. *    year  - For this year the age is calculated.
  3689. *
  3690. *   RESULT
  3691. *    ep - The age of the moon on the specified date.
  3692. *
  3693. *   EXAMPLE
  3694. *    ...
  3695. *    ep := GregorianMoonAge(18,9,1994);
  3696. *    ...
  3697. *
  3698. *   NOTES
  3699. *    Use this only for 1582 to 4100!
  3700. *    This is only a experimental version!
  3701. *
  3702. *   BUGS
  3703. *    unknown.
  3704. *
  3705. *   SEE ALSO
  3706. *    MoonMonthAge(),GregorianEP()
  3707. *
  3708. *****************************************************************************
  3709. *
  3710. *
  3711. *)
  3712.  
  3713.    PROCEDURE MoonMonthAge(month,ep : SHORTINT) : SHORTINT;
  3714.  
  3715. (*
  3716. *****i* Date/MoonMonthAge ***************************************************
  3717. *
  3718. *   NAME
  3719. *    MoonMonthAge -- Calculates the age of the moon on month start (V33)
  3720. *
  3721. *   SYNOPSIS
  3722. *    ep := MoonMonthAge(month,ep);
  3723. *
  3724. *    PROCEDURE MoonMonthAge(month,ep : SHORTINT) : SHORTINT;
  3725. *
  3726. *   FUNCTION
  3727. *    Returns the age of the moon on the start of a month.
  3728. *
  3729. *   INPUTS
  3730. *    month - Month for which the moonage is needed.
  3731. *    ep    - 'Epakte' of the newyears-day.
  3732. *
  3733. *   RESULT
  3734. *    ep - The moonage on the 1. of the specified month.
  3735. *
  3736. *   EXAMPLE
  3737. *    ...
  3738. *    ep := MoonMonthAge(2,17); (* 17 is for 1994 *)
  3739. *    ...
  3740. *
  3741. *   NOTES
  3742. *    This is only a experimental version!
  3743. *
  3744. *   BUGS
  3745. *    unknown.
  3746. *
  3747. *   SEE ALSO
  3748. *    GregorianMonthDays()
  3749. *
  3750. *****************************************************************************
  3751. *
  3752. *
  3753. *)
  3754.  
  3755.    BEGIN
  3756.      IF month = 1 THEN
  3757.        RETURN(ep);
  3758.      ELSE
  3759.        IF month MOD 2 = 0 THEN
  3760.          ep := (MoonMonthAge(month-1,ep) + GregorianMonthDays(month-1,year)) MOD 29;
  3761.        ELSE
  3762.          ep := (MoonMonthAge(month-1,ep) + GregorianMonthDays(month-1,year)) MOD 30;
  3763.        END;
  3764.        RETURN(ep);
  3765.      END;
  3766.    END MoonMonthAge;
  3767.  
  3768.  VAR
  3769.     ep    : SHORTINT;
  3770.  
  3771.  BEGIN
  3772.    ep := GregorianEP(year);
  3773.    ep := MoonMonthAge(month,ep);
  3774.    ep := ep + day -1;
  3775.    IF month > 1 THEN
  3776.      IF month MOD 2 = 0 THEN
  3777.        ep := ep MOD 30;
  3778.        IF ep = 0 THEN
  3779.          ep := 30;
  3780.        END;
  3781.      ELSE
  3782.        ep := ep MOD 29;
  3783.        IF ep = 0 THEN
  3784.          ep := 29;
  3785.        END;
  3786.      END;
  3787.    ELSE
  3788.      IF ep > 29 THEN
  3789.        ep := ep MOD 29;
  3790.      END;
  3791.    END;
  3792.    RETURN(ep);
  3793.  END GregorianMoonAge;
  3794.  
  3795. (*
  3796.  PROCEDURE GregorianEasterOld(year : INTEGER; VAR dday,dmonth : SHORTINT);
  3797.  
  3798. (*
  3799. ******* Date/GregorianEaster ************************************************
  3800. *
  3801. *   NAME
  3802. *    GregorianEaster -- Returns the date of eastern in a year (V33)
  3803. *
  3804. *   SYNOPSIS
  3805. *    GregorianEaster(year,dday,dmonth);
  3806. *
  3807. *    PROCEDURE GregorianEaster(year : INTEGER;
  3808. *        VAR dday,dmonth : SHORTINT);
  3809. *
  3810. *   FUNCTION
  3811. *    Returns the date of eastern for a specified year.
  3812. *
  3813. *   INPUTS
  3814. *    year  - eastern is calculated for this year
  3815. *
  3816. *   RESULT
  3817. *    dday   - day of easter-Sunday
  3818. *    dmonth - month of easter-Sunday
  3819. *
  3820. *   EXAMPLE
  3821. *    ...
  3822. *    GregorianEaster(1994,dday,dmonth);
  3823. *    ...
  3824. *
  3825. *   NOTES
  3826. *    Use this only for 1582 to 4100!
  3827. *    This is only a experimental version!
  3828. *
  3829. *   BUGS
  3830. *    In some years eastern lies one week behind!
  3831. *
  3832. *   SEE ALSO
  3833. *    GregorianMoonAge(),GregorianDaysAfterWeekday()
  3834. *
  3835. *****************************************************************************
  3836. *
  3837. *
  3838. *)
  3839.  
  3840.  VAR
  3841.     ep    : SHORTINT;
  3842.  
  3843.  BEGIN
  3844.    dday := 21;
  3845.    dmonth := 3;
  3846.    ep := GregorianMoonAge(21,3,year);
  3847.    IF ep < 14 THEN
  3848.      dday := dday + (14-ep);
  3849.    ELSE
  3850.      dday := dday + (29-ep) + 13;
  3851.    END;
  3852.    IF dday > 31 THEN
  3853.      dday := dday - 31;
  3854.      INC(dmonth);
  3855.    END;
  3856.    dday := dday + GregorianDaysAfterWeekday(dday,dmonth,year,Sunday);
  3857.    IF dday > 31 THEN
  3858.      dday := dday - 31;
  3859.      INC(dmonth);
  3860.    END;
  3861.  END GregorianEasterOld;
  3862. *)
  3863.  
  3864.  PROCEDURE GregorianEaster*(year : INTEGER; VAR dday,dmonth : SHORTINT);
  3865.  
  3866. (*
  3867. ******* Date/GregorianEaster ************************************************
  3868. *
  3869. *   NAME
  3870. *    GregorianEaster -- Returns the date of eastern in a year (V33)
  3871. *
  3872. *   SYNOPSIS
  3873. *    GregorianEaster(year,dday,dmonth);
  3874. *
  3875. *    PROCEDURE GregorianEaster(year : INTEGER;
  3876. *        VAR dday,dmonth : SHORTINT);
  3877. *
  3878. *   FUNCTION
  3879. *    Returns the date of eastern for a specified year.
  3880. *
  3881. *   INPUTS
  3882. *    year  - eastern is calculated for this year
  3883. *
  3884. *   RESULT
  3885. *    dday   - day of easter-Sunday
  3886. *    dmonth - month of easter-Sunday
  3887. *
  3888. *   EXAMPLE
  3889. *    ...
  3890. *    GregorianEaster(1994,dday,dmonth);
  3891. *    ...
  3892. *
  3893. *   NOTES
  3894. *    Use this only for 1900 to 2099!
  3895. *    Tested for 1977-1994! But this formula is from Gauß - so it must be
  3896. *    correct :)
  3897. *
  3898. *   BUGS
  3899. *    None.
  3900. *
  3901. *   SEE ALSO
  3902. *    GEP(),GregorianJHSB()
  3903. *
  3904. *****************************************************************************
  3905. *
  3906. *
  3907. *)
  3908.  
  3909.  VAR
  3910.      a,d,e,f    : SHORTINT;
  3911.      M,N    : SHORTINT;
  3912.  
  3913.  BEGIN
  3914.    M := (30 - GEP(year)) - 7;
  3915.    IF M < 0 THEN
  3916.      M := M + 30;
  3917.    END;
  3918.    N := GregorianJHSB(year)-2;
  3919.    IF N < 1 THEN
  3920.      N := N + 7;
  3921.    END;
  3922.    a := SHORT(year MOD 19);
  3923.    d := SHORT((19*LONG(a)+M) MOD 30);
  3924.    e := SHORT((2*(year MOD 4)+4*(year MOD 7)+6*LONG(d)+N) MOD 7);
  3925.    f := d+e;
  3926.    IF f < 10 THEN (* märz *)
  3927.      dmonth := 3;
  3928.      dday := 22+f;
  3929.    ELSE (* april *)
  3930.      dmonth := 4;
  3931.      dday := f-9;
  3932.      IF dday=26 THEN
  3933.        dday := 19;
  3934.      ELSIF (dday=25) AND (d=28) AND (a>10) THEN
  3935.        dday := 18;
  3936.      END;
  3937.    END;
  3938.  END GregorianEaster;
  3939.  
  3940.  (* ----------------------------------------------------------------------- *)
  3941.  
  3942.  PROCEDURE TimeZoneFactor*(degree : SHORTINT) : SHORTINT;
  3943.  
  3944. (*
  3945. ******* Date/TimeZoneFactor *************************************************
  3946. *
  3947. *   NAME
  3948. *    TimeZoneFactor -- Returns the value you have to add to GMT time (V33)
  3949. *
  3950. *   SYNOPSIS
  3951. *    addhours := TimeZoneFactor(degrees);
  3952. *
  3953. *    PROCEDURE TimeZoneFactor(degree : SHORTINT) : SHORTINT;
  3954. *
  3955. *   FUNCTION
  3956. *    This gives you the hours you have to add to GMT time,
  3957. *    specified on the fact, that a timezone is 15 degrees
  3958. *    and that GMT is centered on 0 degrees!
  3959. *
  3960. *   INPUTS
  3961. *    degrees - Position of timezone you live in (from -180 to +180)
  3962. *
  3963. *   RESULT
  3964. *    addhours - Time to add to GMT time to get your locale zone time
  3965. *        (-12 to +12)
  3966. *
  3967. *   EXAMPLE
  3968. *    ...
  3969. *    addhours := TimeZoneFactor(-8);
  3970. *    ...
  3971. *
  3972. *   NOTES
  3973. *    none
  3974. *
  3975. *   BUGS
  3976. *    No errorcheck, if you put in valid degrees (-180 to +180)
  3977. *    Only full degrees are supportet, keep sure that you
  3978. *    round in the right way for 0.x degree places
  3979. *    I am not sure about the correct +/- behaviour!!!
  3980. *
  3981. *   SEE ALSO
  3982. *
  3983. *
  3984. *****************************************************************************
  3985. *
  3986. *
  3987. *)
  3988.  
  3989.  BEGIN
  3990.    IF degree >= 0 THEN
  3991.      RETURN(SHORT(SHORT(ENTIER(degree / 15.0 + 0.5))));
  3992.    ELSE
  3993.      RETURN(SHORT(SHORT(ENTIER(degree / 15.0 - 0.5))));
  3994.    END;
  3995.  END TimeZoneFactor;
  3996.  
  3997.  
  3998.  PROCEDURE LMT*(secs : LONGINT; meridiandegree, posdegree : REAL) : LONGINT;
  3999.  
  4000. (*
  4001. ******* Date/LMT ************************************************************
  4002. *
  4003. *   NAME
  4004. *    LMT -- Calculates your local time in your timezone (V33)
  4005. *
  4006. *   SYNOPSIS
  4007. *    secs := LMT(secs,meridian,pos);
  4008. *
  4009. *    PROCEDURE LMT(secs : LONGINT; meridiandegree,
  4010. *        posdegree : REAL) : LONGINT;
  4011. *
  4012. *   FUNCTION
  4013. *    Calculates your Local Mean Time of you place!
  4014. *
  4015. *   INPUTS
  4016. *    secs     - Seconds of the running day (hours*3600+min*60+sec)
  4017. *    meridian - Degrees of your timezone-meridian
  4018. *    pos      - Degrees of your place
  4019. *
  4020. *   RESULT
  4021. *    secs - Local seconds of the running day
  4022. *
  4023. *   EXAMPLE
  4024. *    ...
  4025. *    secs := LMT(76080,15.0,8.923055556);
  4026. *    ...
  4027. *
  4028. *   NOTES
  4029. *    none
  4030. *
  4031. *   BUGS
  4032. *    No errorcheck, if you put in valid degrees (-180 to +180)
  4033. *
  4034. *   SEE ALSO
  4035. *
  4036. *
  4037. *****************************************************************************
  4038. *
  4039. *
  4040. *)
  4041.  
  4042.  BEGIN
  4043.    RETURN(secs + ENTIER((meridiandegree / 15.0 - posdegree / 15.0)*3600.0));
  4044.  END LMT;
  4045.  
  4046.  
  4047.  PROCEDURE TimeToSec*(hour,min,sec : SHORTINT) : LONGINT;
  4048.  
  4049. (*
  4050. ******* Date/TimeToSec ******************************************************
  4051. *
  4052. *   NAME
  4053. *    TimeToSec -- Returns the time in seconds (V33)
  4054. *
  4055. *   SYNOPSIS
  4056. *    secs := TimeToSec(hour,min,sec);
  4057. *
  4058. *    PROCEDURE TimeToSec(hour,min,sec : SHORTINT) : LONGINT;
  4059. *
  4060. *   FUNCTION
  4061. *    Gives you back the time in seconds
  4062. *
  4063. *   INPUTS
  4064. *    hour - hours you want (0-23)
  4065. *    min  - minutes you want (0-59)
  4066. *    sec  - seconds you want (0-59)
  4067. *
  4068. *   RESULT
  4069. *    secs - Time in seconds
  4070. *
  4071. *   EXAMPLE
  4072. *    ...
  4073. *    secs := TimeToSec(21,15,00);
  4074. *    ...
  4075. *
  4076. *   NOTES
  4077. *    Don't forget to convert AM/PM time to 24h time!
  4078. *
  4079. *   BUGS
  4080. *    No errorcheck, if you use a valid time
  4081. *
  4082. *   SEE ALSO
  4083. *    SecToTime()
  4084. *
  4085. *****************************************************************************
  4086. *
  4087. *
  4088. *)
  4089.  
  4090.  BEGIN
  4091.    RETURN(LONG(LONG(hour))*3600+LONG(min)*60+sec);
  4092.  END TimeToSec;
  4093.  
  4094.  
  4095.  PROCEDURE SecToTime*(secs : LONGINT; VAR hour,min,sec : SHORTINT);
  4096.  
  4097. (*
  4098. ******* Date/SecToTime ******************************************************
  4099. *
  4100. *   NAME
  4101. *    SecToTime -- Returns the time from seconds (V33)
  4102. *
  4103. *   SYNOPSIS
  4104. *    SecToTime(secs,hour,min,sec);
  4105. *
  4106. *    PROCEDURE SecToTime(secs : LONGINT; VAR hour,min,sec : SHORTINT);
  4107. *
  4108. *   FUNCTION
  4109. *    Gives you back the time from the specified seconds
  4110. *
  4111. *   INPUTS
  4112. *    secs - Time in seconds
  4113. *
  4114. *   RESULT
  4115. *    hour - hours (0-23)
  4116. *    min  - minutes (0-59)
  4117. *    sec  - seconds (0-59)
  4118. *
  4119. *   EXAMPLE
  4120. *    ...
  4121. *    SecToTime(76860,hour,min,sec);
  4122. *    ...
  4123. *
  4124. *   NOTES
  4125. *    Don't forget to convert 24h time to AM/PM time if needed!
  4126. *
  4127. *   BUGS
  4128. *    No errorcheck, if you use a valid time
  4129. *
  4130. *   SEE ALSO
  4131. *    TimeToSec()
  4132. *
  4133. *****************************************************************************
  4134. *
  4135. *
  4136. *)
  4137.  
  4138.  BEGIN
  4139.    hour := SHORT(SHORT(secs DIV 3600));
  4140.    secs := secs - LONG(LONG(hour)) * 3600;
  4141.    min := SHORT(SHORT(secs DIV 60));
  4142.    sec := SHORT(SHORT(secs - min * 60));
  4143.  END SecToTime;
  4144.  
  4145.  (* ----------------------------------------------------------------------- *)
  4146.  
  4147.  PROCEDURE JulianWeek*(day,month : SHORTINT; year : INTEGER) : SHORTINT;
  4148.  
  4149. (*
  4150. ******* Date/JulianWeek *****************************************************
  4151. *
  4152. *   NAME
  4153. *    JulianWeek -- Gets the weeknumber of a specified date. (V33)
  4154. *
  4155. *   SYNOPSIS
  4156. *    weeknr := JulianWeek(day,month,year);
  4157. *
  4158. *    PROCEDURE JulianWeek(day,month : SHORTINT;
  4159. *        year : INTEGER) : SHORTINT;
  4160. *
  4161. *   FUNCTION
  4162. *    JulianWeek gets the weeknumber for a specified date.
  4163. *
  4164. *   INPUTS
  4165. *    day   - day of the date
  4166. *    month - month of the date
  4167. *    year  - year of the date
  4168. *
  4169. *   RESULT
  4170. *    week - This is the number of the week the specified date lies in.
  4171. *        If the first day in a new year is a Friday, Saturday or
  4172. *        Sunday, this would be the last week of the last year!
  4173. *        If the 29.12. is a Monday, the 30.12. is a Monday or a Tuesday,
  4174. *        the 31.12. is a Monday, Tuesday or a Wednesday this is the
  4175. *        first week of the next year!
  4176. *
  4177. *   EXAMPLE
  4178. *    ...
  4179. *    weeknr := JulianWeek(4,10,1582);
  4180. *    ...
  4181. *
  4182. *   NOTES
  4183. *    It is better only to use this function for years from 0 to 1582!
  4184. *
  4185. *   BUGS
  4186. *    For years < 0 errors could occur.
  4187. *
  4188. *   SEE ALSO
  4189. *    GregorianWeek(),HeisWeek(),JulianWeekday(),JulianDayDiff(),
  4190. *    JulianDaySmaller()
  4191. *
  4192. *****************************************************************************
  4193. *
  4194. *
  4195. *)
  4196.  
  4197.  TYPE
  4198.     Wds    = SET;
  4199.  
  4200.  VAR
  4201.     days        : LONGINT;
  4202.     firstweekday    : Weekdays;
  4203.  
  4204.  BEGIN
  4205.    firstweekday := JulianWeekday(1,1,year);
  4206.    days := (JulianDayDiff(1,1,year,day,month,year) + firstweekday -1) DIV 7;
  4207.    IF firstweekday > Thursday THEN
  4208.      IF days = 0 THEN
  4209.        days := JulianWeek(31,12,year-1);
  4210.      ELSIF (firstweekday = Sunday) AND JulianLeapYear(year) AND (month = 12) AND (day = 31) THEN
  4211.        days := 1;
  4212.      END;
  4213.      RETURN(SHORT(SHORT(days)));
  4214.    ELSE
  4215.      IF ~JulianDaySmaller(day,month,year,29,12,year) THEN
  4216.        firstweekday := JulianWeekday(day,12,year);
  4217.        CASE day OF
  4218.          29 : IF firstweekday = Monday THEN
  4219.                 days := 0;
  4220.               END;|
  4221.          30 : IF firstweekday IN {Monday,Tuesday} THEN
  4222.                 days := 0;
  4223.               END;|
  4224.          31 : IF firstweekday IN {Monday,Tuesday,Wednesday} THEN
  4225.                 days := 0;
  4226.               END;
  4227.        ELSE
  4228.        END;
  4229.      END;
  4230.      RETURN(SHORT(SHORT(days +1)));
  4231.    END;
  4232.  END JulianWeek;
  4233.  
  4234.  
  4235.  PROCEDURE GregorianWeek*(day,month : SHORTINT; year : INTEGER) : SHORTINT;
  4236.  
  4237. (*
  4238. ******* Date/GregorianWeek **************************************************
  4239. *
  4240. *   NAME
  4241. *    GregorianWeek -- Gets the weeknumber of a specified date. (V33)
  4242. *
  4243. *   SYNOPSIS
  4244. *    weeknr := GregorianWeek(day,month,year);
  4245. *
  4246. *    PROCEDURE GregorianWeek(day,month : SHORTINT;
  4247. *        year : INTEGER) : SHORTINT;
  4248. *
  4249. *   FUNCTION
  4250. *    GregorianWeek gets the weeknumber for a specified date.
  4251. *
  4252. *   INPUTS
  4253. *    day   - day of the date
  4254. *    month - month of the date
  4255. *    year  - year of the date
  4256. *
  4257. *   RESULT
  4258. *    week - This is the number of the week the specified date lies in.
  4259. *        If the first day in a new year is a Friday, Saturday or
  4260. *        Sunday, this would be the last week of the last year!
  4261. *        If the 29.12. is a Monday, the 30.12. is a Monday or a Tuesday,
  4262. *        the 31.12. is a Monday, Tuesday or a Wednesday this is the
  4263. *        first week of the next year!
  4264. *
  4265. *   EXAMPLE
  4266. *    ...
  4267. *    weeknr := GregorianWeek(4,10,1582);
  4268. *    ...
  4269. *
  4270. *   NOTES
  4271. *    It is better only to use this function for years from 0 to 3000!
  4272. *
  4273. *   BUGS
  4274. *    For years < 0 errors could occur.
  4275. *
  4276. *   SEE ALSO
  4277. *    JulianWeek(),HeisWeek(),GregorianWeekday(),GregorianDayDiff(),
  4278. *    GregorianDaySmaller()
  4279. *
  4280. *****************************************************************************
  4281. *
  4282. *
  4283. *)
  4284.  
  4285.  TYPE
  4286.     Wds    = SET;
  4287.  
  4288.  VAR
  4289.     days        : LONGINT;
  4290.     firstweekday    : Weekdays;
  4291.  
  4292.  BEGIN
  4293.    firstweekday := GregorianWeekday(1,1,year);
  4294.    days := (GregorianDayDiff(1,1,year,day,month,year) + firstweekday -1) DIV 7;
  4295.    IF firstweekday > Thursday THEN
  4296.      IF days = 0 THEN
  4297.        days := GregorianWeek(31,12,year-1);
  4298.      ELSIF (firstweekday = Sunday) AND GregorianLeapYear(year) AND (month = 12) AND (day = 31) THEN
  4299.        days := 1;
  4300.      END;
  4301.      RETURN(SHORT(SHORT(days)));
  4302.    ELSE
  4303.      IF ~GregorianDaySmaller(day,month,year,29,12,year) THEN
  4304.        firstweekday := GregorianWeekday(day,12,year);
  4305.        CASE day OF
  4306.          29 : IF firstweekday = Monday THEN
  4307.                 days := 0;
  4308.               END;|
  4309.          30 : IF firstweekday IN {Monday,Tuesday} THEN
  4310.                 days := 0;
  4311.               END;|
  4312.          31 : IF firstweekday IN {Monday,Tuesday,Wednesday} THEN
  4313.                 days := 0;
  4314.               END;
  4315.        ELSE
  4316.        END;
  4317.      END;
  4318.      RETURN(SHORT(SHORT(days +1)));
  4319.    END;
  4320.  END GregorianWeek;
  4321.  
  4322.  
  4323.  PROCEDURE HeisWeek*(day,month : SHORTINT; year : INTEGER) : SHORTINT;
  4324.  
  4325. (*
  4326. ******* Date/HeisWeek *******************************************************
  4327. *
  4328. *   NAME
  4329. *    HeisWeek -- Gets the weeknumber of a specified date. (V33)
  4330. *
  4331. *   SYNOPSIS
  4332. *    weeknr := HeisWeek(day,month,year);
  4333. *
  4334. *    PROCEDURE HeisWeek(day,month : SHORTINT;
  4335. *        year : INTEGER) : SHORTINT;
  4336. *
  4337. *   FUNCTION
  4338. *    HeisWeek gets the weeknumber for a specified date.
  4339. *
  4340. *   INPUTS
  4341. *    day   - day of the date
  4342. *    month - month of the date
  4343. *    year  - year of the date
  4344. *
  4345. *   RESULT
  4346. *    week - This is the number of the week the specified date lies in.
  4347. *        If the first day in a new year is a Friday, Saturday or
  4348. *        Sunday, this would be the last week of the last year!
  4349. *        If the 29.12. is a Monday, the 30.12. is a Monday or a Tuesday,
  4350. *        the 31.12. is a Monday, Tuesday or a Wednesday this is the
  4351. *        first week of the next year!
  4352. *
  4353. *   EXAMPLE
  4354. *    ...
  4355. *    weeknr := HeisWeek(4,10,1582);
  4356. *    ...
  4357. *
  4358. *   NOTES
  4359. *    It is better only to use this function for years from 0 to 8000!
  4360. *
  4361. *   BUGS
  4362. *    For years < 0 errors could occur.
  4363. *
  4364. *   SEE ALSO
  4365. *    JulianWeek(),GregorianWeek(),HeisWeekday(),HeisDayDiff(),
  4366. *    HeisDaySmaller()
  4367. *
  4368. *****************************************************************************
  4369. *
  4370. *
  4371. *)
  4372.  
  4373.  TYPE
  4374.     Wds    = SET;
  4375.  
  4376.  VAR
  4377.     days        : LONGINT;
  4378.     firstweekday    : Weekdays;
  4379.  
  4380.  BEGIN
  4381.    firstweekday := HeisWeekday(1,1,year);
  4382.    days := (HeisDayDiff(1,1,year,day,month,year) + firstweekday -1) DIV 7;
  4383.    IF firstweekday > Thursday THEN
  4384.      IF days = 0 THEN
  4385.        days := HeisWeek(31,12,year-1);
  4386.      ELSIF (firstweekday = Sunday) AND HeisLeapYear(year) AND (month = 12) AND (day = 31) THEN
  4387.        days := 1;
  4388.      END;
  4389.      RETURN(SHORT(SHORT(days)));
  4390.    ELSE
  4391.      IF ~HeisDaySmaller(day,month,year,29,12,year) THEN
  4392.        firstweekday := HeisWeekday(day,12,year);
  4393.        CASE day OF
  4394.          29 : IF firstweekday = Monday THEN
  4395.                 days := 0;
  4396.               END;|
  4397.          30 : IF firstweekday IN {Monday,Tuesday} THEN
  4398.                 days := 0;
  4399.               END;|
  4400.          31 : IF firstweekday IN {Monday,Tuesday,Wednesday} THEN
  4401.                 days := 0;
  4402.               END;
  4403.        ELSE
  4404.        END;
  4405.      END;
  4406.      RETURN(SHORT(SHORT(days +1)));
  4407.    END;
  4408.  END HeisWeek;
  4409.  
  4410.  (* ----------------------------------------------------------------------- *)
  4411.  
  4412.  BEGIN
  4413.    (* Gregorian reform in Rom *)
  4414.    BeforeGregorianDay := 4;
  4415.    BeforeGregorianMonth := 10;
  4416.    BeforeGregorianYear := 1582;
  4417.    AfterGregorianDay := 15;
  4418.    AfterGregorianMonth := 10;
  4419.    AfterGregorianYear := 1582;
  4420.    StartHeisDay := 1;
  4421.    StartHeisMonth := 1;
  4422.    StartHeisYear := 3200;
  4423.    (* Dates of Gregorian reform in
  4424.       Deutschland, Niederlande, Schweiz, Dänemark:
  4425.         18.02.1700-01.03.1700
  4426.       Großbritannien
  4427.         02.09.1752-14.09.1752
  4428.       Schweden
  4429.         17.02.1753-01.03.1753
  4430.       Rußland
  4431.     ? (oktober Revolution)
  4432.       Griechenland
  4433.         ??.??.1923-??.??.1923 *)
  4434.    (* Bremen/Arbergen = 8° 55' 23" East, 53° 4' 8" North *)
  4435.  END Date.
  4436.